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

Python:将含9位小数与Z的ISO字符串日期转为datetime对象

解决datetime.fromisoformat解析带9位小数和Z的ISO字符串报错问题

问题原因

Python的datetime.fromisoformat()方法在3.10及更早版本有两个限制:

  1. 不支持解析末尾带Z(表示UTC时区)的ISO字符串;
  2. 最多只能解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:09