如何在没有dateutils的情况下在python中读取非ISO和ISO格式的日期时间字符串?

如何在没有dateutils的情况下在python中读取非ISO和ISO格式的日期时间字符串?,python,datetime,timezone,Python,Datetime,Timezone,我有以下三个日期: “2015-01-08T08:21:43.8082Z” “2015-01-08T08:21:43.808200Z” “2015-01-08T08:21:43Z” 我试着用python阅读它们,就像这样:datetime.fromsoformat(date\u str.replace('Z','+00:00')),但是对于第一个,这失败了 我想这是因为第一个不是ISO格式的 我的问题是:python中有没有一种快速的方法(没有第三方方法)来读取所有三种类型的tz感知日期字符

我有以下三个日期:

  • “2015-01-08T08:21:43.8082Z”
  • “2015-01-08T08:21:43.808200Z”
  • “2015-01-08T08:21:43Z”
我试着用python阅读它们,就像这样:
datetime.fromsoformat(date\u str.replace('Z','+00:00'))
,但是对于第一个,这失败了

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


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

要解析第一个示例,您可以这样做

datetime.datetime.strptime(date_str.replace("Z","+00:00"),"%Y-%m-%dT%H:%M:%S.%f%z")
顺便提一下,这也将处理第二个示例

但这仍然需要为不同的格式选择不同的解析器

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

  • 您可以通过向毫秒添加尾随零来清除输入,以使其可被isoformat接受,就像您已经在修复时区一样。您可以这样做:

    datetime.datetime.fromisoformat(date_str.replace("Z",".000000+00:00"[len(date_str)-20:]))
    
    这将适用于所有3种格式,以及毫秒精度的其他一些变化。尽管在代码审查中,我会拒绝这种方法,因为我认为它很脆弱

  • 如果您想要一个足够灵活的解析器,能够独立处理输入中的微小变化,那么这就是
    dateutil
    的用途

  • 必须具备处理任意非标准格式的灵活性。要么编写,要么导入


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

    可以补充的是,你为了dateutil的方便而牺牲了效率。这是一种痛苦,Python在微秒级上如此挑剔。。.在中工作得很好。@MrFuppes我认为人们不会对名为
    fromsoformat()的函数抱怨太多
    坚持显示的字符串实际上应该是ISO格式。不是Python对微秒挑剔;这是ISO标准。但是正如您所指出的,有一个很好的理由建议
    datetime
    也应该有一个
    fromrfc3339()
    function.你确定ISO 8601规定了精确/允许的小数秒数吗?例如,建议不是这样;不幸的是,我没有访问最新版本的ISO 8601-2:2019我已经检查过了,你完全正确。小数位数可以是灵活的,但必须“经双方同意”“:它不要求接受另一方可能发送的任何内容。标准库允许在秒内使用0、3或6位小数,在小时或分钟内完全不使用小数。这是合理的:没有十进制小时或十进制分钟这样的东西,4十进制秒也没有SI名称。