Python:将含9位小数与Z的ISO字符串日期转为datetime对象
解决datetime.fromisoformat解析带9位小数和Z的ISO字符串报错问题
问题原因
Python的datetime.fromisoformat()方法在3.10及更早版本有两个限制:
- 不支持解析末尾带
Z(表示UTC时区)的ISO字符串; - 最多只能解析6位微秒(因为Python的datetime对象微秒精度是6位,超过会触发ValueError)。
这就是你去掉Z并截断到6位小数后能正常转换的核心原因。
解决方案
方案1:手动处理字符串(无需升级Python或第三方库)
先移除末尾的Z,再将小数部分截断到6位,之后用fromisoformat解析:
from datetime import datetime, timezone raw_date = "2022-11-11T06:19:32.776289776Z" # 移除Z并拆分日期与小数部分 without_z = raw_date.rstrip("Z") if "." in without_z: date_part, micro_part = without_z.split(".", 1) # 截断小数到6位,不足时补0(可选操作) truncated_micro = micro_part[:6].ljust(6, "0") processed_date = f"{date_part}.{truncated_micro}" else: processed_date = without_z # 解析为datetime对象,如需时区感知则绑定UTC时区 dt = datetime.fromisoformat(processed_date) dt_utc = dt.replace(tzinfo=timezone.utc)
方案2:升级到Python 3.11+
Python 3.11开始,fromisoformat()已支持解析带Z的UTC字符串,并且会自动截断超过6位的小数(多余部分直接丢弃),无需手动调整:
from datetime import datetime raw_date = "2022-11-11T06:19:32.776289776Z" dt = datetime.fromisoformat(raw_date) # 此时dt是带UTC时区的datetime对象(tzinfo=datetime.timezone.utc)
方案3:使用dateutil库(兼容更多格式)
如果可以安装第三方库,python-dateutil的isoparse方法能自动处理这类格式,无需手动调整:
from dateutil.parser import isoparse raw_date = "2022-11-11T06:19:32.776289776Z" dt = isoparse(raw_date)
内容的提问来源于stack exchange,提问作者Saurabh Verma
相关产品推荐
相关产品推荐

