Pytz.astimezone не учитывает летнее время?

В 2013 году 1 июня я ожидаю, что часовой пояс "PST8PDT" будет вести себя как GMT + 7, так как это сокращение летнего времени в этом часовом поясе. Однако он ведет себя как GMT + 8:

>>> 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>)

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

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

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

Ответ 1

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

Из pytz документации:

К сожалению, использование аргумента 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>)