将RFC 3339纳米时间转换为Python日期时间



是否有一种简单的方法将RFC 3339纳米时间转换为常规的Python时间戳?

例如time = '2022-07-14T12:01:25.225089838+08:00',我找到了使用datetime的方法

from datetime import datetime
time = '2022-07-14T12:01:25.225089+08:00'
date = datetime.fromisoformat(time)  # good
time = '2022-07-14T12:01:25.225089838+08:00'
date = datetime.fromisoformat(time)  # error

它适用于'2022-07-14T12:01:25.225089+08:00'这样的字符串,但它不适用于上面的时间。

有几种方法可以做到这一点。这取决于输入格式是什么以及如何定义一个简单的方法。实际上有很多帖子问你类似的问题。如果你有兴趣的话,我将在最后贴出一些供你参考,请在下次贴出之前检查一下。

datetime对象的主要问题是它在秒后只保存6个数字。如果你想保留所有的数字,你需要一个不同的数据结构来保存它。

如果你能接受在6位截断,FObersteiner的答案是完美的。另一个方法是香草datetime字符串解析

from datetime import datetime
date = '2022-07-14T12:01:25.225089838+08:00'.removesuffix('+08:00')
x = datetime.strptime( date[:-3], '%Y-%m-%dT%H:%M:%S.%f')

如果你想保留所有的数字。你可能想从datetime类扩展创建你自己的类,或者为它创建一些函数。

  1. 将RFC 3339时间转换为标准Python时间戳

  2. 解析包含纳秒的日期时间字符串

from datetime.fromisoformat docs:

警告:此操作不支持解析任意ISO 8601字符串——它仅用作datetime.isoformat()的逆操作。一个功能更全面的ISO 8601解析器dateutil.parser. isopparse可在第三方包dateutil中获得。


dateutil的isopparse将完成这项工作:

from dateutil.parser import isoparse
time = '2022-07-14T12:01:25.225089838+08:00'
date = isoparse(time) 
print(date)
# 2022-07-14 12:01:25.225089+08:00
print(repr(date))
# datetime.datetime(2022, 7, 14, 12, 1, 25, 225089, tzinfo=tzoffset(None, 28800))

注意:它不会四舍五入到微秒,它只是将小数点后3位切掉。基本上,如果你处理的是RFC 3339这样的标准化格式,你可以自己做切片,比如

from datetime import datetime
time = '2022-07-14T12:01:25.225089838+08:00'
date = datetime.fromisoformat(time[:-9] + time[-6:])
print(date)
# 2022-07-14 12:01:25.225089+08:00

最新更新