How to convert Python's .isoformat() string back into datetime object
本问题已经有最佳答案,请猛点这里访问。
因此,在Python3中,可以使用.isoformat()生成一个iso 8601日期,但不能将isoformat()创建的字符串转换回datetime对象,因为Python自己的datetime指令不匹配。即%z=0500而不是05:00(由.isoformat()生成)。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 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甚至不遵守自己的字符串格式化指令。
我知道datetime在python中已经很糟糕了,但是这真的超出了不合理的范围,进入了一个愚蠢的世界。
告诉我这不是真的。
事实证明,这是这个问题目前最好的"解决方案":
1 | pip install python-dateutil |
那么……
1 2 3 4 5 6 | import datetime import dateutil.parser def getDateTimeFromISO8601String(s): d = dateutil.parser.parse(s) return d |
。
试试这个:
1 2 3 4 5 | >>> 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) |
用途:
1 2 | >>> gt("2008-08-12T12:20:30.656234Z") datetime.datetime(2008, 8, 12, 12, 20, 30, 656234) |
号