Немного странно, что, когда я хочу получить часовой пояс для Европы/Парижа с помощью pytz, он доставляет меня в часовой пояс PMT вместо GMT + 1, когда он, похоже, работает в Европе и Берлине.
Не понятно? Посмотрите на этот фрагмент:
#!/usr/bin/python
import os
import datetime
from pytz.tzfile import build_tzinfo
base='/usr/share/zoneinfo/'
tz = build_tzinfo('Europe/Paris',
open(os.path.join(base,'Europe','Paris'), 'rb'))
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)
tz = build_tzinfo('Europe/Berlin',
open(os.path.join(base,'Europe','Berlin'), 'rb'))
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)
вывод:
2009-01-30 09:00:00 PMT+0009
2009-01-30 09:00:00 CET+0100
когда действительно паритет должен быть также CET + 1.
Построение из datetime.datetime.now(tz) получило бы правильное значение независимо от того, что.
У кого-нибудь есть идея?
Ответ 1
Документы говорят, что вы не можете использовать datetime.datetime(..., tzinfo)
, как вы делаете:
К сожалению, использование аргумента tzinfo стандартных конструкторов datetime не работает с pytz для многих часовых поясов.
И любопытно, что, несмотря на все признаки того, что часовой пояс Europe/Paris
ошибочен, когда вы на самом деле используете с localize
, как он рекомендует, он тем не менее работает:
>>> tz= pytz.timezone('Europe/Paris') # using built-in zoneinfo
>>> tz
<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD> # what? Pierre et Miquelon Time?
>>> datetime.datetime(2010,1,1,12,0,0, tzinfo=tz)
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>) # bad
>>> tz.localize(datetime.datetime(2010,1,1,12,0,0))
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>) # OK
Обратите внимание, что свойство tzinfo
локализованного datetime ссылается на совершенно другой объект на tz
, из которого он был создан, используя только имя.
Это тайна для меня, почему это происходит. Кажется, проблема с файлами города, которые понимают несколько названий часовых поясов, но почему вы не получаете часовой пояс по умолчанию для города, пока не назовете localize
, я понятия не имею.
(Честно говоря, я никогда не доверял Python datetime и tzinfo stuff. Очень предпочитаю работать с метками времени UTC.)