在 Python 中验证 ISO-8601 日期时间字符串?

新手上路,请多包涵

我想编写一个函数,它接受一个字符串并返回 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 许可协议

阅读 664
1 个回答

最新版本的 Python(从 3.7 开始)在 datetime 标准库中有一个 fromisoformat() 函数。请参阅: https ://docs.python.org/3.7/library/datetime.html

所以这可以解决问题:

 from datetime import datetime

def datetime_valid(dt_str):
    try:
        datetime.fromisoformat(dt_str)
    except:
        return False
    return True

更新:

我了解到 Python 无法将“Z”后缀识别为有效。因为我想在我的 API 中支持这一点,所以我现在正在使用(在合并 Matt 的反馈之后):

 from datetime import datetime

def datetime_valid(dt_str):
    try:
        datetime.fromisoformat(dt_str.replace('Z', '+00:00'))
    except:
        return False
    return True

原文由 Hans Bouwmeester 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题