Python中.localize和tzinfo的datetime差异

11

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

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

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


请参见此解释 - Jerther
1个回答

8
当你创建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 is

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

那么d1是本地化时间的更合适和正确的方式吗? - Nick
1
@Nick 是的,没错。 - levi

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