У меня 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
для настройки времени в соответствии с в запрошенный часовой пояс.
utc_time.replace(tzinfo=pytz.utc).astimezone(tz)
. Примечание. pytz.utc
- это особый случай (всегда нулевое смещение utc). В этом случае вам не нужен localize()
звонок. Если вы все же сохраните его (для общности); затем добавьте вызов tz.normalize()
вокруг выражения (это может потребоваться, если исходный часовой пояс не UTC).
- person jfs; 31.08.2014
localize
необходим, потому что utc_time
не содержит информации о часовом поясе. Без этого astimezone
работать не будет.
- person Tzach; 01.09.2014
replace()
в моем предыдущем комментарии?
- person jfs; 01.09.2014
utcfromtimestamp
. Также datetime.datetime.utcnow()
устанавливает для tzinfo значение None.
- person CrackerJack9; 14.07.2019
localize
примерно на 7% медленнее, чем replace
(это также пример, используемый в документации)
- person CrackerJack9; 14.07.2019
Это точное назначение функции fromutc
:
tz.fromutc(utc_time)
(astimezone
функция вызывает fromutc
под капотом, но сначала пытается преобразовать в UTC, что в вашем случае не требуется)
localize
или replace
- person CrackerJack9; 14.07.2019
replace
- person Sean McCarthy; 26.03.2021
Я согласен с ответом Цаха. Просто хотел добавить, что параметр is_dst не требуется:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
Этот код преобразует текущее время в формате UTC в текущую дату и время с учетом часового пояса.
В то время как приведенный ниже код преобразует текущее время в формате UTC в дату и время с учетом часового пояса, которое не обязательно является текущим. Часовой пояс просто добавляется к значению времени UTC.
tz.localize(datetime.utcnow())
astimezone
: dt.astimezone(tz)
. См. Также этот ответ и документы pytz.
- person qris; 06.04.2018
Могу я порекомендовать использовать стрелку? Если я понял вопрос:
>>> 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)
datetime
, однако мой проект большой, и я не хочу создавать больше путаницы, используя другую библиотеку даты и времени. Я обязательно рассмотрю возможность использования его в других проектах.
- person Tzach; 12.08.2014
Еще один очень простой способ:
Поскольку метод 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)
Работает быстро, и вам не нужно импортировать дополнительные библиотеки.