为什么时区感知日期时间的tzinfo不等于时区?

时间:2017-06-06 18:17:00

标签: python datetime timezone pytz

>>> import pytz
>>> tz = pytz.timezone('America/Chicago')
>>> dt_naive = datetime(year=2017, month=6, day=6)
>>> dt_aware = tz.localize(dt_naive)
>>> dt_aware.tzinfo == tz
False

这些差异的原因是什么?

>>> dt_aware.tzinfo
<DstTzInfo 'America/Chicago' CDT-1 day, 19:00:00 DST>
>>> tz
<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>

2 个答案:

答案 0 :(得分:4)

第一个已根据提供的日期和时间进行调整,2016-06-06T00:00:00。中央夏令时(CDT)此时生效。它比UTC(24:00 - 05:00 = 19:00)落后5小时。

第二个尚未本地化,因此它为您提供可用时区数据中的第一个偏移量,恰好是Local Mean Time (LMT)条目。 You can see this in the tzdata sources here。 LMT比UTC落后5小时50分钟36秒。 LMT偏移的秒数在pytz中的某处舍入,因此18:09正确地反映了这一点(24:00 - 05:51 = 18:09

答案 1 :(得分:3)

pytz确定时区的键是您为创建对象而传递的字符串:'America/Chicago'。该密钥可通过.zone属性获得。

>>> tz = pytz.timezone('America/Chicago')
>>> dt_naive = datetime(year=2017, month=6, day=6)
>>> dt_aware = tz.localize(dt_naive)
>>> dt_aware.tzinfo == tz
False
>>> tz.zone
'America/Chicago'
>>> dt_aware.tzinfo.zone == tz.zone
True