【问题标题】:How to read non-ISO and ISO formatted date-time string in python without dateutils?如何在没有 dateutils 的情况下在 python 中读取非 ISO 和 ISO 格式的日期时间字符串?
【发布时间】:2021-05-02 20:26:56
【问题描述】:

我有以下三个 tz-aware date_str:

  • "2015-01-08T08:21:43.8082Z"
  • "2015-01-08T08:21:43.808200Z"
  • ""2015-01-08T08:21:43Z"

我尝试像这样在 python 中读取它们:datetime.fromisoformat(date_str.replace('Z', '+00:00')),但是第一个失败。

我猜是因为第一个不是 ISO 格式的。

我的问题是:在 python 中是否有一种快速的方法(没有 3rd 方方法)来读取所有三种类型的 tz 感知日期字符串?

【问题讨论】:

    标签: python datetime timezone


    【解决方案1】:

    要解析第一个例子,你可以这样做

    datetime.datetime.strptime(date_str.replace("Z","+00:00"),"%Y-%m-%dT%H:%M:%S.%f%z")
    

    顺便说一句,这也将处理第二个示例。

    但这仍然需要为不同的格式选择不同的解析器。所以你有三个选择。

    1. 您编写代码(例如,使用正则表达式)来检查您获得的字符串并调用适当的函数来解析它。

    2. 您可以通过在毫秒后添加尾随零来清理输入,以使其为fromisoformat 所接受,就像您已经在修复时区所做的那样。你可以这样做:

      datetime.datetime.fromisoformat(date_str.replace("Z",".000000+00:00"[len(date_str)-20:]))
      

      这将适用于您的所有 3 种格式,以及毫秒精度的其他一些变化。虽然在代码审查中我会拒绝这种方法,因为我认为它很脆弱。

    3. 如果您想要一个足够灵活的解析器来自行处理输入中的微小变化,那么dateutil 就是这样做的。

    处理任意非标准格式的灵活性必须在某个地方。要么你写它,要么你导入它。

    我会支持dateutil 反对我可以编写的任何实现,因为它必然会更好地处理我不期望的输入。但你可能会得出不同的结论。

    【讨论】:

    • 可以补充说,您为了 dateutil 的方便而牺牲了效率。有点痛苦的是,Python 在微秒方面很挑剔……在other languages 中运行得非常好。
    • @MrFuppes 我不认为人们可以对一个名为fromisoformat() 的函数抱怨太多,它坚持所显示的字符串实际上应该是ISO 格式。对微秒很挑剔的不是 Python;它是 ISO 标准。但正如您所指出的,有一个很好的论据建议datetime 也应该有一个fromrfc3339() 函数。
    • 您确定 ISO 8601 指定了准确/允许的小数秒数吗?例如。 this 另有建议;不幸的是,我无法访问最新版本的 ISO 8601-2:2019
    • 我已经检查过了,你是完全正确的。小数位数可以灵活,但只能“通过双方协议”:它不需要接受对方可能发送的任何内容。标准库允许以秒为单位的 0、3 或 6 位小数,而在小时或分钟内则完全没有。这是有道理的:没有十进制小时或十进制之类的东西,4 位小数秒也没有 SI 名​​称。
    猜你喜欢
    • 2020-05-20
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2017-04-29
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多