2013-08-30 1 views
20

Я пытаюсь преобразовать временную зону datetime объект в UTC, а затем обратно в его часовой пояс. У меня есть следующий фрагментпреобразование даты и времени в pytz - поведение дуновения разума

t = datetime(
    2013, 11, 22, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

сейчас в IPython:

In [18]: t 
Out[18]: datetime.datetime(
    2013, 11, 22, 11, 0, tzinfo=<DstTzInfo 'Europe/Warsaw' WMT+1:24:00 STD> 
) 

и теперь давайте попробуем сделать преобразование в UTC и обратно. Я бы ожидать, чтобы иметь такое же представление, как:

In [19]: t.astimezone(pytz.utc).astimezone(pytz.timezone('Europe/Warsaw')) 
Out[19]: datetime.datetime(
    2013, 11, 22, 10, 36, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD> 
) 

Тем не менее, мы видим, что Out[18] и Out[19] отличаются. Что происходит?

+1

Django хранит DateTimes наивных баз данных мудры. Если вы справитесь с этим делом, посмотрите здесь, чтобы преобразовать даты в необходимый часовой пояс: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage – Jingo

+0

ли Django хранит наивные datetime of not is контролируется установкой 'USE_TZ'. Если это «True», то Django рассматривает даты в формах и т. Д. Как находящиеся в [текущем часовом поясе] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting- the-current-time -zone) и сохраняет их в db, преобразованном в UTC. – Anentropic

ответ

44

В документации http://pytz.sourceforge.net/ говорится: «К сожалению, аргумент tzinfo стандартных конструкторов datetime не работает» с pytz для многих часовых поясов ». Код

t = datetime(
    2013, 5, 11, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

не работает в соответствии с этим, вместо этого вы должны использовать метод локализовать:

t = pytz.timezone('Europe/Warsaw').localize(
     datetime(2013, 5, 11, hour=11, minute=0)) 
+0

Очень приятно знать. – dgel

+0

Любая идея, в чем причина? – yakxxx

+18

Модуль даты и времени Python предполагает, что объект часового пояса имеет постоянное смещение по UTC. Объекты часовых поясов Pytz имеют разные смещения UTC (поскольку время перехода на летнее время, а также изменение исторических часовых поясов). Когда вы используете локализацию pytz(), он может выбрать правильное смещение для этой конкретной даты. Когда вы используете замену datetime (tzinfo ==), вы получаете самое старое смещение UTC для этого часового пояса в базе данных. –