pytz.astimezone没有考虑夏令时吗?

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

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

1个回答

30
datetime 构造函数无法分配时区,因为它不会给时区对象一个调整夏令时的机会 - 它无法访问日期。对于世界上某些地区,时区的名称和偏移量多年来也发生了变化,这会导致更多问题。
pytz文档中得知:

不幸的是,对于许多时区,使用标准 datetime 构造函数中的 tzinfo 参数 "不起作用"。

请改用带有 naive datetime 的 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>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接