时区偏移符号被dateutil反转



有人知道为什么python的dateutil在解析datetime字段时会反转GMT偏移量的符号吗?

显然,这个特性不仅是dateutil的已知结果,也是其他解析函数的已知结果。但这会导致不正确的日期时间结果,除非应用预处理破解:

from dateutil import parser
jsDT = 'Fri Jan 02 2015 03:04:05.678910 GMT-0800'
python_datetime = parser.parse(jsDT)
print(python_datetime)
>>> 2015-01-02 03:04:05.678910+08:00
jsDT = 'Fri Jan 02 2015 03:04:05.678910 GMT-0800'
if '-' in jsDT:
    jsDT = jsDT.replace('-','+')
elif '+' in jsDT:
    jsDT = jsDT.replace('+','-')
python_datetime = parser.parse(jsDT)
print(python_datetime)
>>> 2015-01-02 03:04:05.678910-08:00

似乎dateutil在这里使用了POSIX样式的符号。它与Python无关。其他软件也能做到这一点。来自tz数据库:

# We use POSIX-style signs in the Zone names and the output abbreviations,
# even though this is the opposite of what many people expect.
# POSIX has positive signs west of Greenwich, but many people expect
# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
# the abbreviation "GMT+4" and corresponds to 4 hours behind UT
# (i.e. west of Greenwich) even though many people would expect it to
# mean 4 hours ahead of UT (i.e. east of Greenwich).

tz数据库几乎无处不在。

示例:

$ TZ=Etc/GMT-8 date +%z
+0800

你可能会期待一个不同的时区:

>>> from datetime import datetime
>>> import pytz
>>> pytz.timezone('America/Los_Angeles').localize(datetime(2015, 1, 2, 3, 4, 5, 678910), is_dst=None).strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')
'2015-01-02 03:04:05.678910 PST-0800'

注:PST,而非GMT

尽管dateutil使用POSIX风格的标志,即使是PST时区缩写:

>>> from dateutil.parser import parse
>>> str(parse('2015-01-02 03:04:05.678910 PST-0800'))
'2015-01-02 03:04:05.678910+08:00'

Python3中的datetime.strptime()将其解释为"正确":

$ TZ=America/Los_Angeles python3                                               
...
>>> from datetime import datetime
>>> str(datetime.strptime('2015-01-02 03:04:05.678910 PST-0800', '%Y-%m-%d %H:%M:%S.%f %Z%z'))
'2015-01-02 03:04:05.678910-08:00'

注意标志。

尽管POSIX风格的标志引起了混乱;dateutil的行为不太可能改变。参见dateutil错误:"GMT+1"被解析为"GMT-1",@Lennart Regebro的回复:

以这种方式解析GTM+1实际上是Posix规范的一部分。因此,这是一个特性,而不是一个bug。

请参阅POSIX规范中如何定义TZ环境变量,glibc使用了类似的定义。

目前尚不清楚dateutil为什么使用类似POSIX TZ的语法来解释时间字符串中的时区信息。语法并不完全相同,例如,POSIX语法需要在输入中不存在的utc偏移量中使用分号:hh[:mm[:ss]]

dateutil.parser.parse的源代码解释了这一点。

查看类似GMT+3或BRST+3的内容。注意这并不意味着"我在格林尼治标准时间后3小时",但"我的时间+3是GMT"。如果找到,我们将逻辑,以便时区解析代码将获得正确的

进一步评论:

对于类似GMT+3的东西,时区是而不是GMT。

相关内容

  • 没有找到相关文章

最新更新