为何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
相关产品推荐
相关产品推荐

