20

在 2013 年 6 月 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>)

相比之下,在 2013 年 1 月 1 日,它的行为(正确)类似于 GMT+8:

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

我究竟做错了什么?提前致谢!

4

1 回答 1

26

您不能在datetime构造函数中分配时区,因为它没有给时区对象一个调整夏令时的机会——它无法访问日期。这会给世界某些地区带来更多问题,这些地区的时区名称和偏移量多年来一直在变化。

pytz文档中:

不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数对 pytz “不起作用”。

改用localize带有天真的日期时间的方法。

>>> 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>)
于 2013-09-18T02:32:44.140 回答