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

1 июня 2013 года я ожидаю, что часовой пояс "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 января 2013 года он ведет себя (правильно), как 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>)