首页 > 解决方案 > 如何在没有 dateutils 的情况下在 python 中读取非 ISO 和 ISO 格式的日期时间字符串?

问题描述

我有以下三个 tz-aware date_str

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

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

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

标签: pythondatetimetimezone

解决方案


要解析第一个示例,您可以执行

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反对我可以编写的任何实现,因为它必然会更好地处理我不期望的输入。但你可能会得出不同的结论。


推荐阅读