datetuil 在使用小写字母时导致错误的 utc 偏移量

datetuil results in wrong utc offset when using lower case

我正在尝试使用 dateutil 将日期转换为不同的时区。 我注意到,在创建 tz 对象时使用小写字母会导致不正确的时区。

>>> from datetime import datetime
>>> from dateutil import tz

>>> tz.gettz('utc-6')
tzstr('utc-6')
>>> tz.gettz('UTC-6')
tzstr('UTC-6')

到目前为止,一切似乎都是正确的,但是当将 tzstr 传递给 datetime 对象时,小写 tzstr 将应用反向偏移量。对于所有偏移量,+ 和 - 都会发生这种情况。

我使用 %z 来显示应用的偏移量,但这个问题影响了所有日期时间操作。

>>> datetime.now(tz.gettz('UTC-6')).strftime('%z')
'-0600'

>>> datetime.now(tz.gettz('utc-6')).strftime('%z')
'+0600'
>>> datetime.now(tz.gettz('utc-06')).strftime('%z')
'+0600'
>>>
>>> datetime.now(tz.gettz('utc-8')).strftime('%z')
'+0800'
>>>

是我自己疏忽大了,还是确实是包的bug? 我在文档中找不到任何将用户输入限制为大写 UTC+X 的内容。

(Python 版本在 Windows 和 python-dateutil 2.8.2 上是 tags/v3.9.9:ccb0e6a,但在 Linux 和 python 2.8.2 上也出现)

默认情况下,dateutil 库与 POSIX-style 时区不同,后者“使用倒置偏移量格式,因此通常 GMT+3 将被解析为比 GMT 晚 3 小时的偏移量。tzstr 时区对象会将其解析为比格林威治标准时间提前 3 小时的偏移量”(dateutil documentation on dateutil.tz.tzstr())。

该库通过检查您的时区缩写是“UTC”还是“GMT”(区分大小写)来确定何时反转偏移量,然后将偏移量乘以 -1。因为检查区分大小写,“UTC-6”的偏移量确实正确地偏移到 -0600 但“utc-6”没有(tzstr source code)。

# Here we break the compatibility with the TZ variable handling.
# GMT-3 actually *means* the timezone -3.
if res.stdabbr in ("GMT", "UTC") and not posix_offset:
    res.stdoffset *= -1

不管这是否是故意的决定,在当前的 tzstr 实现中,您应该在将时区字符串传递给 gettz() 之前将它们大写。