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()
之前将它们大写。
我正在尝试使用 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()
之前将它们大写。