如何解析ISO 8601格式的日期?

时间:2020-03-06 14:40:10  来源:igfitidea点击:

我需要将RFC 3339字符串(如" 2008-09-03T20:56:35.450686Z")解析为Python的" datetime"类型。

我在Python标准库中找到了" strptime",但这不是很方便。

做这个的最好方式是什么?

解决方案

我们得到的确切错误是什么?是否如下所示:

>>> datetime.datetime.strptime("2008-08-12T12:20:30.656234Z", "%Y-%m-%dT%H:%M:%S.Z")
ValueError: time data did not match format:  data=2008-08-12T12:20:30.656234Z  fmt=%Y-%m-%dT%H:%M:%S.Z

如果是,则可以在"。"上分割输入字符串,然后将微秒添加到获得的日期时间。

试试这个:

>>> 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)
>>>

import re,datetime
s="2008-09-03T20:56:35.450686Z"
d=datetime.datetime(*map(int, re.split('[^\d]', s)[:-1]))

尝试使用iso8601模块;它正是这样做的。

python.org Wiki上的WorkingWithTime页面上提到了其他几个选项。

请注意,在Python 2.6+和Py3K中,%f字符捕获微秒。

>>> datetime.datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

在这里查看问题