2016-11-22 8 views
2

Я пытаюсь применить tzinfo к объекту datetime.Python datetime и tzinfo объекты (изменение минут вместо часов)

In [1]: from datetime import datetime 
In [2]: import pytz 

In [3]: london = pytz.timezone("Europe/London") 
In [4]: london 
Out[5]: <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD> 

In [6]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, london) 
In [7]: localized_date_object 
Out[8]: datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>) 

In [9]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [10]: utc_date_object 
Out[11]: datetime.datetime(2016, 1, 1, 11, 31, 0, 5000, tzinfo=<UTC>) 

In [16]: paris = pytz.timezone("Europe/Paris") 
In [17]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, paris) 
In [18]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [19]: utc_date_object 
Out[19]: datetime.datetime(2016, 1, 1, 11, 21, 0, 5000, tzinfo=<UTC>) 

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

ответ

1

Я думаю, что вы должны использовать CET для времени в Париже и UTC для лондонского времени. Я использую немного другой подход, но это работает для меня:

from datetime import datetime 
from pytz import timezone 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('Europe/London')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('CET')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

UPDATE:

При сохранении значения времени должно быть также сохранена информацией, связанной с временной зоной. Лучшая практика ИМО - хранить все в UTC и конвертировать для просмотра в «пользовательский» часовой пояс. КСТАТИ преобразование из UTC в Европу/Париж работает безупречно, попробуйте следующее:

winter = datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = winter.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-01-01 12:30:00.005000+01:00 

summer = datetime(2016, 6, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = summer.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-06-01 13:30:00.005000+02:00 
+0

Спасибо, Джири. Так что для Лондона это будет UTC зимой и BST летом. – Sebabouche

+0

И CEST для Франции летом;) – Sebabouche

+1

@Sebabouche Это не вопрос определения правильного часового пояса для ваших городов ;-) Когда вы храните время где-то, там также должна храниться связанная информация о часовом поясе (CET или CEST). Лучшая практика ИМО - хранить все в UTC и конвертировать для просмотра в «пользовательский» часовой пояс. Преобразование BTW из UTC в Европу/Париж работает безупречно, см. Обновление ответа. – Jiri

0

В строке # 5 отображается странный выход - <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>, который кажется одноминутным (минус 1 день + 23:59:00 часов).

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

0

Часовой пояс Европа/Лондон после UTC 1 минута. Часовой пояс Европа/Париж до UTC на 9 минут. Лондон и Париж близки к Гринвичу географически, поэтому смещение по часовой стрелке невелико.

Если вы пытаетесь

pytz.timezone("Asia/Shanghai") 

, вы увидите изменение часов.

+0

Ok, так что я не смотрел в нужном месте, я искал для обычного преобразования часовых поясов, + 1П, -1H, как British Summer Time (БСТ). Но я отмечаю ваш ответ как правильно;) – Sebabouche