Python .localize 和 tzinfo 之间的日期时间差异

Python datetime difference between .localize and tzinfo

为什么这两行会产生不同的结果?

>>> import pytz
>>> from datetime import datetime

>>> local_tz = pytz.timezone("America/Los_Angeles")

>>> d1 = local_tz.localize(datetime(2015, 8, 1, 0, 0, 0, 0)) # line 1
>>> d2 = datetime(2015, 8, 1, 0, 0, 0, 0, local_tz) # line 2
>>> d1 == d2
False

造成差异的原因是什么,我应该使用哪个来本地化日期时间?

当您创建 d2 = datetime(2015, 8, 1, 0, 0, 0, 0, local_tz) 时,它无法正确处理夏令时 (DST)。 local_tz.localize() 确实如此。

d1

>>> local_tz.localize(datetime(2015, 8, 1, 0, 0, 0, 0))
datetime.datetime(
    2015, 8, 1, 0, 0, 
    tzinfo=<DstTzInfo 'America/Los_Angeles' PDT-1 day, 17:00:00 DST>
)

d2

>>> datetime(2015, 8, 1, 0, 0, 0, 0, local_tz)
datetime.datetime(
    2015, 8, 1, 0, 0, 
    tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>
)

可以看出他们代表的不是同一时间

如果您要使用 UTC,

d2 方式很好。 UTC 没有要处理的夏令时 (DST) 转换。

正确处理时区的方法是使用local_tz.localize()支持夏令时(DST)

可以在此处找到更多信息和其他示例:
http://pytz.sourceforge.net/#localized-times-and-date-arithmetic