假设我有以下日期时间对象:
>>> dt
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
我可以像ISO 8601那样打印该对象:
>>> dt.isoformat()
'2015-05-13T18:05:55.320000-07:00'
在Python 3.4下,如果删除时区中的冒号,我可以解析ISO 8601字符串的字符串:
>>> import re
>>> ts='2015-05-13T18:05:55.320-07:00'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> tsm=re.sub(r'([+-]\d+):(\d+)$', r'\1\2', '2015-05-13T18:05:55.320-07:00')
>>> tsm
'2015-05-13T18:05:55.320-0700'
>>> datetime.datetime.strptime(tsm, tf)
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
在Python 2.7下,情况更糟,因为%z
似乎不起作用as documented:
>>> tsm='2015-05-13T18:05:55.320-0700'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> datetime.datetime.strptime(tsm, tf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.%f%z'
请注意,它与在Python 3.4下工作的格式字符串相同。
问题:除了使用dateutil(效果很好)之外,是否有合理的方法使用datetime.strptime或标准库中的其他内容解析ISO 8601日期字符串?