Python 为什么使用时区感知日期时间';s tzinfo不等于时区?

Python 为什么使用时区感知日期时间';s tzinfo不等于时区?,python,datetime,timezone,pytz,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.tzin

这些不同的原因是什么

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

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


第二个尚未本地化,因此它将为您提供可用时区数据中的第一个偏移量,这恰好是条目。LMT比UTC晚5小时50分36秒。LMT偏移的秒数在pytz的某个地方被四舍五入,因此
18:09
正确地反映了这一点(
24:00-05:51=18:09

根据
pytz
确定时区的键是创建对象时传递的字符串:
'America/Chicago'
。该键可通过
.zone
属性使用

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

@MarkRansom我不同意这是一个复制品(事实上我已经看到了那个目标)。我在问为什么他们不被认为是平等的,以及如何在
dt_aware.tzinfo
tz
之间进行某种有意义的平等比较——如果可能的话。好的,我现在明白了。你真正的问题被掩盖了。唯一明确的问题是“这些不同的原因是什么”被另一个问题回答了。你能建议一种方法在时区实例之间进行有意义的比较吗?i、 他们是否有相同的utcoffset。。。仅仅比较他们的
str(tz)
上的相等性如何?这与使用
str(tz)
相同。我们能做得更好吗?有许多别名,例如,“美国/芝加哥”区和“美国/中部”区在所有实际用途中应视为相等+无论如何,@wim我没有意识到
str(tz)
repr(tz)
不同。因为
zone
是决定对象行为的关键,所以我认为这是唯一真正代表对象身份的东西。在某些历史背景下,
'America/Chicago'
'US/Central'
可能是不同的。如果你只想知道它们在某个特定的时间点是否相等,那么你可以用两个时区来定位该时间点,并测试它们是否相等。
US/Central
America/Chicago
的别名。它由tzdb中的
链接
条目表示。因此,它们在历史背景方面是相同的。我认为wim正在寻找一种方法来比较两个不同区域在其整个过渡规则集上的等效性。@MattJohnson很遗憾,
pytz
没有为这两种情况选择一个规范的区域名称,并让
.zone
返回一致的内容。看起来比较两个时区对象的唯一方法是使用对象的私有属性。是的,我得出了相同的结论。我不认为它保留了
链接
的细节,而且它在
tzinfo
所需实现之外几乎没有公开。
>>> 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