【问题标题】:PYTZ 'America/Edmonton' offset wrong [duplicate]PYTZ'美国/埃德蒙顿'偏移错误[重复]
【发布时间】:2012-09-30 07:18:37
【问题描述】:

可能重复:
Weird timezone issue with 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)。更何况 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 小时的偏移量('US/Eastern' 和 'America/Edmonton' 之间的差异)但它给了我 3 小时 26 分钟(即 2 小时一小时26 分钟 :D)

插入timezone('US/Mountain') 会在astimezone() 中产生正确的结果。使用“America/Edmonton”创建可感知的日期时间也可以正常工作。

【问题讨论】:

  • 当你构造 datetime 时区开始时会发生什么,而不是使用 replace? (看起来这基本上是坏的......)
  • 然后它工作正常。可悲的是,这不是我的选择,因为天真的日期时间是由另一个我无法控制的函数返回的:(

标签: python timezone pytz


【解决方案1】:

documentation for pytz 明确表示直接从时区创建日期时间并非在所有情况下都有效,并指示您改为执行以下操作:

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

【讨论】:

    【解决方案2】:

    查看 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 的偏移量是有意义的,它也将与缩写匹配。

    所以时区数据没问题是完全可行的,它只是选择向您显示一个奇怪的日期/时间作为示例。 (老实说,时区的字符串输出根本不会显示时间,这对我来说毫无意义......)

    【讨论】:

    • 在您尝试将时区附加到日期/时间之前,它会显示它包含的最早定义。
    • @MarkRansom:那肯定可以解释,是的......
    • 啊,那是有道理的。但是,在尝试使用 astimezone() 时我仍然看到奇怪的事情 - 上面详细说明
    猜你喜欢
    • 2020-07-16
    • 2019-04-16
    • 2013-03-11
    • 2019-05-23
    • 2016-08-16
    • 1970-01-01
    • 2013-08-10
    • 2020-10-11
    • 2013-06-25
    相关资源
    最近更新 更多