Python-tz я ошибаюсь или это ошибка

Немного странно, что, когда я хочу получить часовой пояс для Европы/Парижа с помощью 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.)