>>> from datetime import datetime
>>> datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
>>> datetime.strptime("2008-09-03T20:56:35.450686+05:00", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686+05:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
>>> datetime.strptime("2008-09-03T20:56:35.450686+05:00", "%Y-%m-%dT%H:%M:%S.%fZ")
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686+05:00' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'
Severalanswersheresuggest使用^{} 解析带有时区的RFC 3339或ISO 8601日期时间,如问题中所示:
这是个坏主意。
假设您希望支持完整的RFC 3339格式,包括对除零以外的UTC偏移量的支持,那么这些答案建议的代码不起作用。实际上,它不能工作,因为使用
strptime
解析RFC 3339语法是不可能的。Python的datetime模块使用的格式字符串无法描述RFC 3339语法。问题是UTC偏移量。RFC 3339 Internet Date/Time Format要求每个日期时间都包含一个UTC偏移量,并且这些偏移量可以是
Z
(简称“Zulu时间”),也可以是+HH:MM
或-HH:MM
格式,如+05:00
或-10:30
。因此,这些都是有效的RFC 3339日期时间:
2008-09-03T20:56:35.450686Z
2008-09-03T20:56:35.450686+05:00
2008-09-03T20:56:35.450686-10:30
唉,
strptime
和strftime
使用的格式字符串没有对应于RFC 3339格式的UTC偏移量的指令。它们支持的指令的完整列表可以在https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior找到,列表中包含的唯一UTC偏移量指令是%z
:这与RFC 3339偏移量的格式不匹配,如果我们尝试在格式字符串中使用
%z
并解析RFC 3339日期,我们将失败:(实际上,上面就是Python 3中的内容。在Python 2中,我们失败的原因更简单,那就是^{} does not implement the ^{} directive at all in Python 2 )
这里建议使用
strptime
的多个答案都可以通过在格式字符串中包含一个文本Z
来解决这个问题,该文本与提问者示例datetime字符串中的Z
匹配(并丢弃它,生成一个不带时区的datetime
对象):因为这会丢弃原始日期时间字符串中包含的时区信息,所以我们是否应该将此结果视为正确的值得怀疑。但更重要的是,由于这种方法涉及将特定的UTC偏移量硬编码为格式字符串,因此当它试图用不同的UTC偏移量解析任何RFC 3339 datetime时,它将阻塞:
除非您确定只需要支持Zulu时间中的RFC 3339日期时间,而不需要支持具有其他时区偏移的日期时间,否则不要使用
strptime
。请使用此处答案中描述的其他方法之一。注意在Python 2.6+和Py3K中,%f字符捕捉微秒。
见第here期
python dateutil包不仅可以解析RFC 3339日期时间字符串(与问题中的日期时间字符串类似),还可以解析其他不符合rfc3339的日期和时间字符串(例如没有UTC偏移量的日期和时间字符串,或者只表示日期的日期和时间字符串)。
<>警告,^ {CD1>}是故意哈奇:它试图在不明确的情况下猜测格式并做出不可避免的假设(仅用手定制)。因此,只有在需要解析未知格式的输入并且可以容忍偶尔的误读时才使用它。(谢谢ivan_pozdeev)
Pypi的名称是^{} ,而不是
dateutil
(谢谢code3monk3y):如果您使用的是Python 3.7,请查看this answer关于
datetime.datetime.fromisoformat
。相关问题 更多 >
编程相关推荐