You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python 3.11可解析该ISO datetime而3.9无法解析?

Python 3.11与3.9中datetime.fromisoformat的解析规则差异

是的,datetime.fromisoformat的ISO格式解析规则在Python 3.11版本发生了明确变更,核心变化是开始支持解析以Z结尾的UTC时间字符串。

具体变更细节

在Python 3.10及更早版本(包括你使用的3.9),fromisoformat仅支持两种格式:

  • 不带时区的本地时间字符串(如2022-11-21T19:44:27.292977)
  • 带显式时区偏移的字符串(如2022-11-21T19:44:27.292977+00:00)

对于ISO 8601标准中用Z表示UTC的格式,该方法完全不识别,直接抛出ValueError。

Python 3.11对该方法进行了扩展:

  • 正式支持解析以Z结尾的UTC时间字符串,将Z视为+00:00的等效标识
  • 解析后会自动为结果设置tzinfo=datetime.timezone.utc,与显式写+00:00的解析效果完全一致

版本差异验证示例

Python 3.11+ 执行成功

Python 3.11.3 (main, Jun  5 2023, 09:32:32) [GCC 13.1.1 20230429] on linux
>>> from datetime import datetime
>>> datetime.fromisoformat('2022-11-21T19:44:27.292977Z')
datetime.datetime(2022, 11, 21, 19, 44, 27, 292977, tzinfo=datetime.timezone.utc)

Python 3.9及更早版本 执行失败

Python 3.9.17 (main, Jun 26 2023, 03:30:25)
[GCC 13.1.1 20230429] on linux
>>> from datetime import datetime
>>> datetime.fromisoformat('2022-11-21T19:44:27.292977Z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid isoformat string: '2022-11-21T19:44:27.292977Z'

3.9及更早版本的兼容方案

如果需要在低版本Python中解析带Z的时间字符串,可先将Z替换为+00:00再调用fromisoformat:

from datetime import datetime

def parse_iso_with_z(time_str):
    processed_str = time_str.replace('Z', '+00:00')
    return datetime.fromisoformat(processed_str)

# 使用示例
dt = parse_iso_with_z('2022-11-21T19:44:27.292977Z')
print(dt)  # 输出: 2022-11-21 19:44:27.292977+00:00

内容的提问来源于stack exchange,提问作者cheezsteak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:23:10