python - 如何在没有 dateutils 的情况下在 python 中读取非 ISO 和 ISO 格式的日期时间字符串?
问题描述
我有以下三个 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 中是否有一种快速的方法(没有第三方方法)来读取所有三种类型的 tz 感知日期字符串?
解决方案
要解析第一个示例,您可以执行
datetime.datetime.strptime(date_str.replace("Z","+00:00"),"%Y-%m-%dT%H:%M:%S.%f%z")
顺便说一句,这也将处理第二个示例。
但这仍然需要为不同的格式选择不同的解析器。所以你有三个选择。
您编写代码(例如,使用正则表达式)来检查您获得的字符串并调用适当的函数来解析它。
您可以通过在毫秒中添加尾随零来清理输入,以使其可以接受
fromisoformat
,就像您已经在修复时区所做的那样。你可以这样做:datetime.datetime.fromisoformat(date_str.replace("Z",".000000+00:00"[len(date_str)-20:]))
这将适用于您的所有 3 种格式,以及毫秒精度的其他一些变化。虽然在代码审查中我会拒绝这种方法,因为我认为它很脆弱。
如果您想要一个足够灵活的解析器来自己处理输入中的微小变化,那么这就是
dateutil
目的。
处理任意非标准格式的灵活性必须在某个地方。要么你写它,要么你导入它。
我会dateutil
反对我可以编写的任何实现,因为它必然会更好地处理我不期望的输入。但你可能会得出不同的结论。
推荐阅读
- python - 为什么在 CPython 中 `len(l) != 0` 比 `bool(l)` 快?
- excel - 如何同时使用 IsNumeric 和 Not IsNumeric 函数?
- c - 获取结构内变量的偏移量是基于 NULL 指针,但为什么呢?
- facebook-graph-api - 当所有元数据都正常时,预览 url 显示不正确
- python - 如何遍历文件夹中的文件以移动具有特定扩展名的每个文件
- sql - 根据从第一个开始的日期加入两个表
- react-native - ReactNative 导航问题
- reactjs - Spotify API 帮助。response_type=code 不工作, response_type=token 可以吗?
- r - 在给出一个带有串扰和情节组合的代码块之后。我无法正确导出任何 html 输出
- c# - 我怎么知道哪个聊天在电报机器人上生成“找不到聊天”异常?