Pytz - Преобразование UTC и часовой пояс в местное время

У меня есть datetime в часовом поясе utc, например:

utc_time = datetime.datetime.utcnow()

И объект времени pytz:

tz = timezone('America/St_Johns')

Каков правильный способ преобразования utc_time в заданный часовой пояс?

Ответ 1

Думаю, я понял:

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)

Эта строка сначала преобразует наивный (часовой пояс не осознает) utc_time datetime объект в объект datetime, который содержит часовой пояс (UTC). Затем он использует функцию astimezone для настройки времени в соответствии с запрошенным часовым поясом.

Ответ 2

Могу ли я рекомендовать использовать стрелку? Если я понял вопрос:

>>> 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)

Ответ 3

Я согласен с ответом Цаха. Просто хотел включить, что параметр is_dst не обязателен:

pytz.utc.localize(datetime.utcnow()).astimezone(tz)

Этот код преобразует текущее время UTC в текущую дату и время с учетом часового пояса.

Принимая во внимание, что код ниже преобразует текущее время UTC в дату/время с учетом часового пояса, которое не обязательно является текущим. Часовой пояс просто добавляется в значение времени UTC.

tz.localize(datetime.utcnow())

Ответ 4

Это точное назначение функции fromutc:

tz.fromutc(utc_time)

(функция astimezone вызывает fromutc под капотом, но сначала пытается преобразовать в UTC, что в вашем случае не требуется)

Ответ 5

Еще один очень простой способ:

Потому что метод 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)

Ответ 6

Вы также можете использовать образец ниже, я использую его для аналогичной задачи

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)

Он работает быстро, и вам не нужно импортировать дополнительные библиотеки.