2013-09-18 4 views
13

On 2013 Jun 1 Я ожидаю, что часовой пояс «PST8PDT» будет вести себя как GMT + 7, так как это сэкономление в этот часовой пояс. Тем не менее, он ведет себя как GMT + 8:pytz.astimezone не учитывает летнее время?

>>> import pytz, datetime 
>>> Pacific = pytz.timezone("PST8PDT") 
>>> datetime.datetime(2013, 6, 1, 12, tzinfo=Pacific).astimezone(pytz.utc) 
datetime.datetime(2013, 6, 1, 20, 0, tzinfo=<UTC>) 

В отличие от 2013 Jan 1 он ведет себя (правильно), как GMT + 8:

>>> datetime.datetime(2013, 1, 1, 12, tzinfo=Pacific).astimezone(pytz.utc) 
datetime.datetime(2013, 1, 1, 20, 0, tzinfo=<UTC>) 

Что я делаю неправильно? Заранее спасибо!

ответ

19

Вы не можете назначить часовой пояс в конструкторе datetime, потому что он не дает объекту часового пояса возможность корректировать переход на летнее время - дата недоступна для него. Это приводит к еще большему количеству проблем для некоторых частей мира, где имя и смещение часового пояса изменились с годами.

Из pytz documentation:

К сожалению, используя tzinfo аргумент стандартные DateTime Конструкторы «» не работает»» с pytz для многих часовых поясов.

Используйте метод localize с наивным datetime вместо этого.

>>> Pacific.localize(datetime.datetime(2013, 6, 1, 12)).astimezone(pytz.utc) 
datetime.datetime(2013, 6, 1, 19, 0, tzinfo=<UTC>) 
>>> Pacific.localize(datetime.datetime(2013, 1, 1, 12)).astimezone(pytz.utc) 
datetime.datetime(2013, 1, 1, 20, 0, tzinfo=<UTC>) 

 Смежные вопросы

  • Нет связанных вопросов^_^