如何将 Python 的 .isoformat() 字符串转换回日期时间对象
How to convert Python's .isoformat() string back into datetime object
所以在Python3中,你可以用.isoformat()生成一个ISO 8601日期,但是你不能将isoformat()创建的字符串转换回日期时间对象,因为Python 自己的日期时间指令不正确匹配。也就是说,%z = 0500 而不是 05:00(由 .isoformat() 生成)。
例如:
>>> strDate = d.isoformat()
>>> strDate
'2015-02-04T20:55:08.914461+00:00'
>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Python34\Lib\_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
来自 Python 的 strptime 文档:(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)
%z UTC offset in the form +HHMM or -HHMM (empty string if the the
object is naive). (empty), +0000, -0400, +1030
所以,简而言之,Python 甚至不遵守自己的字符串格式指令。
我知道 Python 中的 datetime 已经很糟糕了,但这真的超出了不合理的范畴,进入了愚蠢的境地。
告诉我这不是真的。
试试这个:
>>> def gt(dt_str):
... dt, _, us = dt_str.partition(".")
... dt = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S")
... us = int(us.rstrip("Z"), 10)
... return dt + datetime.timedelta(microseconds=us)
用法:
>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)
Python 3.7+
从 Python 3.7 开始,有一种方法 datetime.fromisoformat()
与 isoformat()
完全相反。
年长 Python
如果你的年纪大Python,那么这是目前这个问题的最佳“解法”:
pip install python-dateutil
然后...
import datetime
import dateutil
def getDateTimeFromISO8601String(s):
d = dateutil.parser.parse(s)
return d
所以在Python3中,你可以用.isoformat()生成一个ISO 8601日期,但是你不能将isoformat()创建的字符串转换回日期时间对象,因为Python 自己的日期时间指令不正确匹配。也就是说,%z = 0500 而不是 05:00(由 .isoformat() 生成)。
例如:
>>> strDate = d.isoformat()
>>> strDate
'2015-02-04T20:55:08.914461+00:00'
>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Python34\Lib\_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
来自 Python 的 strptime 文档:(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)
%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). (empty), +0000, -0400, +1030
所以,简而言之,Python 甚至不遵守自己的字符串格式指令。
我知道 Python 中的 datetime 已经很糟糕了,但这真的超出了不合理的范畴,进入了愚蠢的境地。
告诉我这不是真的。
试试这个:
>>> def gt(dt_str):
... dt, _, us = dt_str.partition(".")
... dt = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S")
... us = int(us.rstrip("Z"), 10)
... return dt + datetime.timedelta(microseconds=us)
用法:
>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)
Python 3.7+
从 Python 3.7 开始,有一种方法 datetime.fromisoformat()
与 isoformat()
完全相反。
年长 Python
如果你的年纪大Python,那么这是目前这个问题的最佳“解法”:
pip install python-dateutil
然后...
import datetime
import dateutil
def getDateTimeFromISO8601String(s):
d = dateutil.parser.parse(s)
return d