如何在没有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”
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")
顺便提一下,这也将处理第二个示例
但这仍然需要为不同的格式选择不同的解析器
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名称。