К сожалению, используя аргумент tzinfo
стандарта datetime
конструкторы "не работают" с pytz
для многих часовых поясов.
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
'2002-10-27 12:00:00 LMT+0020'
Это безопасно для часовых поясов без переходов на летнее время, например, UTC:
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
'2002-10-27 12:00:00 UTC+0000'
Как вы заметите:
>>> datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))
datetime.datetime(2000, 1, 1, 0, 1, tzinfo=<DstTzInfo 'Europe/Paris' LMT+0:09:00 STD>)
"LMT + 0: 09: 00 STD"… ?! Это историческое смещение, а не текущий стандарт.
Пакеты часовых поясов (содержащие все исторические смещения с тех пор навсегда), возвращаемые pytz
, не обрабатываются корректно datetime
, и он выбирает некоторое случайное (ну, первое , вероятно) смещение вместо смещение, относящееся к фактическому времени. Можно утверждать, что поскольку ему необходимо сначала правильно интерпретировать время, он не может выбрать правильное смещение по времени из пакета часовых поясов.
Эта библиотека поддерживает только два способа построения локализованного времени.
Во-первых, используйте метод localize()
, предоставляемый библиотекой pytz
.
Это используется для локализации наивного datetime
(datetime
без часового пояса
информация):
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500
Второй способ построения локализованного времени - преобразование существующего
локализованное время с использованием стандартного astimezone()
метода:
>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'
http://pytz.sourceforge.net