Как посчитать разницу во времени между городами на основе вводных данных времени?
Сутки 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