我正在尝试使用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版本,但也出现在带有python2.8.2的Linux上)
发布于 2022-02-13 23:55:37
默认情况下,dateutil库与POSIX风格的时区不同,后者“使用倒置偏移格式,因此通常GMT+3将被解析为格林尼治时间后3小时后的偏移量。tzstr时区对象将将其解析为格林尼治时间之前3小时的偏移量”(关于dateutil.tz.tzstr()的dateutil文档)。
库通过检查时区缩写是否为"UTC“或"GMT”(区分大小写)来确定何时反转偏移量,然后将偏移量乘以-1。因为检查是区分大小写的,所以"UTC-6“的偏移量确实得到了-0600的偏移量,而"utc-6”的偏移量没有(tzstr源代码)。
# 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()之前,您都应该大写一下。
https://stackoverflow.com/questions/71104528
复制相似问题