PYTZ 'America/Edmonton' 时区偏移错误。

6

可能是重复问题:
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'
>>> 

'America/Edmonton'和'US/Eastern'应该是同一时区(17:00:00标准时间)。更不用说16:26:00没有任何意义了。

--更新--

以上内容在Jon Skeet的回答中是有意义的。然而,当我执行以下操作时,情况变得奇怪:

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

我创建了一个简单的日期。由于我的时区是'America/Edmonton',因此我尝试手动设置它:

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

这不应该改变任何内容,因为那是正确的时区。然而:
>>> 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小时('US/Eastern'和'America/Edmonton'之间的差异),但它给了我3小时26分钟(这是2个小时加上一小时26分钟:D)。
插入timezone('US/Mountain')astimezone()中产生正确的结果。使用'America/Edmonton'创建一个感知的日期时间也将正常工作。

当你构建带有时区的datetime时,而不是使用replace,会发生什么?(看起来这基本上是有问题的...) - Jon Skeet
然后它可以正常工作。不幸的是,在我的情况下,这不是一个选项,因为天真的日期时间是由另一个我无法控制的函数返回的 :( - Goro
2个回答

11

pytz文档明确说明直接从时区创建datetime并不适用于所有情况,并引导您改为执行以下操作:

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

3

查看2012c TZDB数据,以下是America/Edmonton的规则集:

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的偏移量是有道理的,并且它也会匹配缩写。

因此,时区数据完全可行,只是选择以奇怪的日期/时间作为示例进行展示(对我来说,一个时区的字符串输出居然显示时间没有任何意义……)


2
在尝试将时区附加到日期/时间之前,它会显示它包含的最早定义。 - Mark Ransom
@MarkRansom:那肯定可以解释这个问题,是的... - Jon Skeet
啊,那就有道理了。然而,当我尝试使用astimezone()时,仍然看到一些奇怪的东西 - 如上所述。 - Goro

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