PYTZ 'America/Edmonton'偏移错误



可能的重复项:
pytz 的奇怪时区问题

这似乎是错误的:

>>> import pytz
>>> z1 = timezone('America/Edmonton')
>>> z2 = timezone('US/Mountain')
>>> z1
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>
>>> z2
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>
>>> pytz.VERSION
'2012f'
>>> 
"美国/

埃德蒙顿"和"美国/东部"应该是同一时区(17:00:00 STD)。更不用说 16:26:00 没有任何意义。

--更新--

在Jon Skeet的回答中,以上是有道理的。但是,当我这样做时,事情变得奇怪:

>>> d = datetime.now()
>>> d
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706)

我创造了一个天真的约会。由于"美国/埃德蒙顿"我的时区,我尝试手动设置:

>>> d2 = d.replace(tzinfo=timezone('America/Edmonton'))
>>> d2
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)

这不应该改变任何东西,因为这是正确的 TZ。然而:

>>> d2.astimezone(timezone('US/Eastern'))
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

这应该给我 2 小时的偏移量("美国/东部"和"美国/埃德蒙顿"之间的差异),但它给了我 3 小时 26 分钟(即 2 小时加上 1 小时 26 分钟:D)

插入timezone('US/Mountain')astimezone() 中产生正确的结果。使用"美国/埃德蒙顿"创建感知日期时间也将正常工作。

pytz 的文档明确指出,直接从时区创建日期时间并非在所有情况下都有效,并指示您执行以下操作:

d2 = timezone('America/Edmonton').localize(d)

查看2012c TZDB数据,以下是美国/埃德蒙顿的规则集:

Zone America/Edmonton    -7:33:52 -       LMT   1906 Sep
                         -7:00    Edm     M%sT  1987
                         -7:00    Canada  M%sT

我不清楚 Python 输出试图向您显示偏移量/名称的日期/时间,但我怀疑它类似于 1900 - 在这种情况下,16:26:00 与 -7:33:52 的偏移量有些意义,并且它也与缩写相匹配。

因此,时区数据很好是完全可行的,它只是选择向您显示一个奇数日期/时间作为示例。(老实说,时区的字符串输出根本不会显示时间对我来说是没有意义的......

最新更新