Python astimezone () неожиданный результат - PullRequest
0 голосов
/ 31 августа 2018

Учитывая переменную, содержащую дату и время 2000-01-01 00:01 в часовом поясе Парижа (UTC + 2 зимой afaik):

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))

Я ожидал, что преобразование в UTC приведет к дате-времени 1999-12-31 22:01, но вместо этого получил:

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris')).astimezone(pytz.utc)
datetime.datetime(1999, 12, 31, 23, 52, tzinfo=<UTC>)

Чего мне не хватает?

Спасибо

1 Ответ

0 голосов
/ 31 августа 2018

К сожалению, используя аргумент 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...