python-tz я не прав или это баг - PullRequest
4 голосов
/ 31 января 2010

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

6 голосов
/ 31 января 2010

Документы говорят, что вы не можете использовать datetime.datetime(..., tzinfo), как вы делаете:

К сожалению, использование аргумента tzinfo стандартных конструкторов даты и времени не работает с 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 локализованной даты и времени ссылается на совершенно иной объект по сравнению с tz, из которого он был создан, и имеет только имя.

Для меня загадка, почему это происходит. Кажется, это проблема с файлами городов, которые понимают названия нескольких часовых поясов, но почему вы не получите часовой пояс по умолчанию для города, пока не наберете localize, я понятия не имею.

(Если честно, я никогда не доверял данным Python о timetime и tzinfo. Очень предпочитаю работать с временными метками int UTC.)

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