Как посчитать разницу во времени между городами на основе вводных данных времени?

Сутки 24 часа. Имеем города Moscow, Yekaterinburg

Например, если в Екатеринбурге 01:00, то код должен вывести, в Москве 23:00.

Если вычислить 1 - 2, то получим -1, а не 23. Как написать правильно?

Попробовал написать код используя pytz, но не понимаю как дальше.

import pytz
from datetime import datetime

Moscow_tz = pytz.timezone('Europe/Moscow')
Moscow_now = datetime.now(Moscow_tz)
Moscow_now_utc = Moscow_now.strftime('%z')

print('Europe/Moscow', f"{Moscow_now.strftime('%z')}")

Yekaterinburg_tz = pytz.timezone('Asia/Yekaterinburg')
Yekaterinburg_now = datetime.now(Yekaterinburg_tz)
print('Asia/Yekaterinburg', f"{Yekaterinburg_now.strftime('%z')}")

Yekaterinburg_now_utc = Yekaterinburg_now.strftime('%z')

print(int(Moscow_now_utc))
print(int(Yekaterinburg_now_utc))

print(int(Moscow_now_utc) - int(Yekaterinburg_now_utc))

Ответы (3 шт):

Автор решения: Дмитрий Рубцов
import pytz
import datetime

Moscow_tz = pytz.timezone('Europe/Moscow')
Moscow_now = datetime.datetime.now(Moscow_tz)
Moscow_now_utc = Moscow_now.strftime('%z')
print(Moscow_now.time())
print('Europe/Moscow', f"{Moscow_now.strftime('%z')}")

Yekaterinburg_tz = pytz.timezone('Asia/Yekaterinburg')
Yekaterinburg_now = datetime.datetime.now(Yekaterinburg_tz)
print(Yekaterinburg_now.time())
print('Asia/Yekaterinburg', f"{Yekaterinburg_now.strftime('%z')}")

Yekaterinburg_now_utc = Yekaterinburg_now.strftime('%z')

print(Moscow_now_utc)
print(Yekaterinburg_now_utc)
t = Yekaterinburg_now - datetime.timedelta(hours=2)
print(t.now())
t = Yekaterinburg_now.hour - Moscow_now.hour
print(t)
→ Ссылка
Автор решения: Mafitis

Получилось так:

from datetime import datetime, timedelta

# текущая дата
Yekaterinburg_date_time = datetime.now()

# вычитание одного дня
Moscow_date_time = Yekaterinburg_date_time - timedelta(hours=2)

print(f"Текущее время в Екатеринбурге: {Yekaterinburg_date_time.strftime('%m-%d %H:%M')}")
print(f"Текущее время в Москве: {Moskow_date_time.strftime('%m-%d %H:%M')}")

вывод:

Текущее время в Екатеринбурге: 11-29 19:50

Текущее время в Москве: 11-29 17:50
→ Ссылка
Автор решения: Stanislav Volodarskiy

Чтобы метку времени перевести в другой часовой пояс используйте datetime.datetime.astimezone. Это единственный способ, который учитывает все тонкости связанные с летним временем, которое может по разному переключаться в разных поясах:

import datetime
import re
import sys
import zoneinfo

dt = ()
tm = ()
tzs = []

for a in sys.argv[1:]:
    m = re.match(r'^(\d+)\.(\d+)\.(\d+)$', a)
    if m is not None:
        dt = tuple(map(int, m.group(1, 2, 3)))
        continue

    m = re.match(r'^(\d+):(\d+)$', a)
    if m is not None:
        tm = tuple(map(int, m.group(1, 2)))
        continue

    found = [z for z in zoneinfo.available_timezones() if a in z]
    if len(found) == 1:
        tzs.append(found[0])
    else:
        print(f'Ошибка: строка "{a}" часовые пояса "{found}".')
        exit(1)

tz1, tz2 = map(zoneinfo.ZoneInfo, tzs)

if len(dt) == 0:
    now = datetime.datetime.now(tz=tz1)
    dt = now.day, now.month, now.year

if len(tm) == 0:
    now = datetime.datetime.now(tz=tz1)
    tm = now.hour, now.minute

time1 = datetime.datetime(*dt[::-1], *tm, tzinfo=tz1)
time2 = time1.astimezone(tz=tz2)

delta = time1.utcoffset() - time2.utcoffset()

print(time1.strftime('%d.%m.%Y %H:%M'), time1.tzinfo)
print(time2.strftime('%d.%m.%Y %H:%M'), time2.tzinfo)
print('разница:', f'-{-delta}' if delta < datetime.timedelta() else delta)
$ python switch_tz.py 29.11.2011 01:20 Yek Mos
29.11.2011 01:20 Asia/Yekaterinburg
28.11.2011 23:20 Europe/Moscow
разница: 2:00:00

$ python switch_tz.py 01:20 Yek Mos
29.11.2024 01:20 Asia/Yekaterinburg
28.11.2024 23:20 Europe/Moscow
разница: 2:00:00

$ python switch_tz.py Yek Mos 
29.11.2024 23:18 Asia/Yekaterinburg
29.11.2024 21:18 Europe/Moscow
разница: 2:00:00

$ python switch_tz.py Yek Kol
29.11.2024 23:32 Asia/Yekaterinburg
30.11.2024 00:02 Asia/Kolkata
разница: -0:30:00

$ python switch_tz.py Yek Kath
29.11.2024 23:38 Asia/Yekaterinburg
30.11.2024 00:23 Asia/Kathmandu
разница: -0:45:00
→ Ссылка