У меня есть datetime
в часовом поясе utc, например:
utc_time = datetime.datetime.utcnow()
И объект времени pytz:
tz = timezone('America/St_Johns')
Каков правильный способ преобразования utc_time
в заданный часовой пояс?
У меня есть datetime
в часовом поясе utc, например:
utc_time = datetime.datetime.utcnow()
И объект времени pytz:
tz = timezone('America/St_Johns')
Каков правильный способ преобразования utc_time
в заданный часовой пояс?
Думаю, я понял:
pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
Эта строка сначала преобразует наивный (часовой пояс не осознает) utc_time
datetime
объект в объект datetime
, который содержит часовой пояс (UTC). Затем он использует функцию astimezone
для настройки времени в соответствии с запрошенным часовым поясом.
Могу ли я рекомендовать использовать стрелку? Если я понял вопрос:
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>
Вы также можете использовать
tz.fromutc(utc_time)
Я согласен с ответом Цаха. Просто хотел включить, что параметр is_dst не обязателен:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
Этот код преобразует текущее время UTC в текущую дату и время с учетом часового пояса.
Принимая во внимание, что код ниже преобразует текущее время UTC в дату/время с учетом часового пояса, которое не обязательно является текущим. Часовой пояс просто добавляется в значение времени UTC.
tz.localize(datetime.utcnow())
Это точное назначение функции fromutc
:
tz.fromutc(utc_time)
(функция astimezone
вызывает fromutc
под капотом, но сначала пытается преобразовать в UTC, что в вашем случае не требуется)
Еще один очень простой способ:
Потому что метод utcnow
возвращает объект наивный, поэтому вам нужно преобразовать объект наивный в осведомленный объект. Используя метод replace
, вы можете преобразовать объект наивный в осведомленный объект. Затем вы можете использовать метод astimezone
для создания нового объекта datetime в другом часовом поясе.
from datetime import datetime
import pytz
utc_time = datetime.utcnow()
tz = pytz.timezone('America/St_Johns')
utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method
st_john_time=utc_time.astimezone(tz) #astimezone method
print(st_john_time)
Вы также можете использовать образец ниже, я использую его для аналогичной задачи
tz = pytz.timezone('America/St_Johns')
time_difference=tz.utcoffset(utc_time).total_seconds() #time difference between UTC and local timezones in 5:30:00 format
utc_time = date + timedelta(0,time_difference)
Он работает быстро, и вам не нужно импортировать дополнительные библиотеки.