2014-06-23 4 views
6

Есть ли кто-нибудь, кто может помочь мне понять, что здесь происходит?Почему pytz localize() не создает объект datetime с tzinfo, соответствующий объекту tz, который его локализовал?

import pytz 
from datetime import datetime 
tz = pytz.timezone('Europe/Berlin') 
print repr(tz) 
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD> 
dt = datetime(2011, 1, 3, 18, 40) 
result = tz.localize(dt) 
print repr(result.tzinfo) 
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD> 
assert result.tzinfo == tz, "Why aren't these the same timezone?" 

Мое понимание было то, что localize() метод на объекте pytz часовых поясов бы наивным объект типа DateTime, и добавить tzinfo свойство, которое соответствует объект часового пояса, выполняющую локализации. В этом случае это, похоже, не происходит.

Ясно, что есть кое-что, что я недопонимаю о часовых поясах или о том, как pytz обрабатывает часовые пояса. Может ли кто-нибудь объяснить?

ответ

7

Фотографии этот же часового пояса - "Europe/Berlin".

Когда вы печатаете их, выходные данные включают аббревиатуру и смещение, которые применяются в этот конкретный момент времени.

Если вы исследуете the tz data sources, вы увидите:

# Zone NAME   GMTOFF RULES  FORMAT [UNTIL] 
Zone Europe/Berlin 0:53:28 -   LMT  1893 Apr 
         1:00  C-Eur  CE%sT 1945 May 24 2:00 
         1:00  SovietZone CE%sT 1946 
         1:00  Germany  CE%sT 1980 
         1:00  EU   CE%sT 

Так, казалось бы, что, когда временная зона не локализована DateTime, то он просто использует первую запись.

Было бы также оказаться, что pytz не сохраняет лишние 28 секунд от первоначального локального среднего отклонения времени - но это не имеет значения, если вы не работаете с датами в Берлине до апреля 1893.

+0

Благодарим Вас за ваш комментарий. Хороший улов на CET/CEST. Это была плохая копия с моей стороны (теперь отредактирована). Я экспериментировал как с датой перехода на летнее время, так и с летней годовщиной. Я попытался запустить это под Python 3.4 с новейшим pytz и получил тот же результат. См. Https://gist.github.com/bjmc/59d8650ae3d2aebb7584 Ваша информация о источнике данных tz оценена. Означает ли это, что атрибут 'tzinfo' в [современной] локализованной дате никогда не сравним с абстрактным объектом временной зоны от pytz? – bjmc

+0

В общем, я бы не рассматривал 'tzinfo' когда-либо сравнимый с другим' tzinfo' без конкретной даты и времени. Однако, если вы знаете, что оба объекта принадлежат pytz (или из [tzlocal] (https://pypi.python.org/pypi/tzlocal)), вы можете сравнить их свойства '.zone', которые просто содержат строку идентификатор зоны («Европа/Берлин»). –

+0

Не уверен, что это ответ. Он просто повторяет, что это проблема. Проблема возникает при попытке заменить tzinfo объекта datetime. –