【问题标题】:Weird behavior on when replacing timezone using pytz timezones vs timezone strings使用 pytz 时区与时区字符串替换时区时的奇怪行为
【发布时间】:2015-10-12 18:09:01
【问题描述】:

我希望使用“US/Central”替换 tzinfo 会得到与使用时区对象 (pytz.timezone('US/Central')) 相同的结果,但显然不是:

In [5]: import arrow
In [6]: d = arrow.get()
In [7]: cst = pytz.timezone('US/Central')

In [8]: d.replace(tzinfo=cst)
Out[8]: <Arrow [2015-07-22T17:40:30.947579-06:00]>

In [9]: d.replace(tzinfo='US/Central')
Out[9]: <Arrow [2015-07-22T17:40:30.947579-05:00]>

注意第 8 行的输出与第 9 行的输出有不同的 UTC 偏移量。

哪种方法是使用 Arrow 和 pytz 替换时区的正确方法?

【问题讨论】:

    标签: python datetime pytz


    【解决方案1】:

    这似乎是一个错误。我猜你看到的是issue 154 -

    .to() 与 pytz.timezone 不兼容

    对于.replace() 方法,您可能会看到同样的情况。问题仍未解决。

    我会说使用箭头一,目前似乎箭头和 pytz 不是那么兼容。

    【讨论】:

    • 原始datetime 对象也会出现同样的问题。时区对象无法知道正确的偏移量,除非它也知道它适用于哪个日期/时间,并且replace 没有提供该信息。
    • 是的,好像箭头在内部使用dateutil.tz。使用 dateutil.tz 会给出正确的值。
    • 有意思,不知道为什么和pytz有出入?直到你指出 dateutil 工作正常,我认为这是不可能的。
    • @MarkRansom: dateutil 不能与时区一起正常工作:它只是隐藏了错误。 pytz 使错误更加明显。就像 Python 2 -> 3 bytes -> Unicode shift:如果你看到编码错误;这并不意味着 Python 3 不正确;这意味着代码被破坏了。上次我检查了the errors from 2012 were still present in arrow
    • @J.F.Sebastian 我的评论基于以下观察结果:dstdateutil.tz.tzlocal() 一起使用时报告了正确的偏移量,而与pytz.timezone('US/Central') 一起使用时则没有,具体取决于它附加到的日期。 datetime 似乎希望 tzinfo 对象是智能的,并根据输入各种函数的日期进行自我调整,而 pytz 似乎是静态的。我无法完全破译您提供的链接,是否存在dateutil 也给出错误结果的情况?
    猜你喜欢
    • 2022-01-03
    • 2012-07-25
    • 2018-01-03
    • 2012-08-29
    • 2020-08-26
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多