我想编写一个函数,它接受一个字符串并返回 True
如果它是有效的 ISO-8601 日期时间—精确到微秒,包括时区偏移 False
否则。
我发现 其他 问题 提供了 解析 日期时间字符串的不同方式,但我只想在 ISO-8601 格式的情况下返回 True
。解析对我没有帮助,除非我能让它为不匹配 ISO-8601 的格式抛出错误。
(我在代码的其他地方使用了很好的 箭头 库。欢迎使用 arrow
的解决方案。)
编辑: 似乎在常见的 Python 日期时间包中不存在“此字符串是否为有效的 ISO 8601 日期时间”的一般解决方案。
因此,为了使这个问题更窄、更具体和可回答,我将选择一个格式字符串来验证这种形式的日期时间字符串:
'2016-12-13T21:20:37.593194+00:00'
目前我正在使用:
format_string = '%Y-%m-%dT%H:%M:%S.%f%z'
datetime.datetime.strptime(my_timestamp, format_string)
这给出:
ValueError: time data '2016-12-13T21:20:37.593194+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
问题似乎在于 UTC 偏移量中的冒号 ( +00:00
)。如果我使用不带冒号的偏移量(例如 '2016-12-13T21:20:37.593194+0000'
),这将按预期正确解析。这显然是因为 datetime
的 %z
令牌 不尊重有冒号的 UTC 偏移形式,只有没有冒号 的形式,即使 根据规范两者都是有效的。
原文由 Stew 发布,翻译遵循 CC BY-SA 4.0 许可协议
最新版本的 Python(从 3.7 开始)在
datetime
标准库中有一个fromisoformat()
函数。请参阅: https ://docs.python.org/3.7/library/datetime.html所以这可以解决问题:
更新:
我了解到 Python 无法将“Z”后缀识别为有效。因为我想在我的 API 中支持这一点,所以我现在正在使用(在合并 Matt 的反馈之后):