有人知道为什么python的dateutil在解析datetime字段时会反转GMT偏移的符号吗?
显然,此功能不仅是dateutil的known outcome,还包括其他解析功能。但是,除非应用预处理黑客,否则会导致INCORRECT日期时间结果:
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
答案 0 :(得分:7)
似乎dateutil
在这里使用POSIX风格的标志。它与Python无关。其他软件也是如此。来自the tz database:
# 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).
The tz database is used almost everywhere
示例:
$ 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'
Python 3中的 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" is parsed as "GMT-1"和@Lennart Regebro的回复:
以这种方式解析GTM + 1实际上是Posix规范的一部分。 因此,这是一个功能,而不是错误。
了解TZ
environment variable is defined in the POSIX specification,glibc如何使用similar definition。
不清楚为什么dateutil
使用POSIX TZ
- 类似语法来解释时间字符串中的时区信息。语法不完全相同,例如,POSIX语法需要在输入中不存在的utc偏移量中使用分号:hh[:mm[:ss]]
。
答案 1 :(得分:1)
source code for dateutil.parser.parse解释了这一点。
检查GMT + 3或BRST + 3等内容。注意 它并不意味着“我在GMT后3小时”,但是 “我的时间+3是GMT”。如果找到,我们会反过来 逻辑,以便时区解析代码将获得它 右。
还有一个评论:
GMT + 3之类的时区不是 GMT。