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

Posted

技术标签:

【中文标题】.localize 和 tzinfo 之间的 Python 日期时间差异【英文标题】:Python datetime difference between .localize and tzinfo 【发布时间】:2017-01-20 11:26:51 【问题描述】:

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

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

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

【问题讨论】:

见this explanation。 【参考方案1】:

当您创建 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>
)

您可以看到它们代表的时间不同。

d2 如果您要使用 UTC,则方法很好。 UTC 没有要处理的夏令时 (DST) 转换。

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

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

【讨论】:

那么 d1 是更合适、更正确的时间本地化方式吗? @Nick 是的,是的。

以上是关于.localize 和 tzinfo 之间的 Python 日期时间差异的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pytz localize() 不生成一个 tzinfo 与本地化它的 tz 对象匹配的 datetime 对象?

为啥 tzinfo 会在 python 中打破创建纪元时间?

使用pytz的Datetime时区转换

使用 pytz 进行日期时间时区转换

python: 为啥 datetime.now() 的 tzinfo 没有? [复制]

datetime.now(tz) 和 datetime(year, month, day, tzinfo=tz) 没有相同的 UTC 偏移量