使用datetime.strptime()解析带Z时间字符串报ValueError如何解决
问题根因
触发值错误的核心原因是格式串中的%Z占位符使用错误:
%Z仅能匹配Python内置注册的时区全称/缩写(比如UTC、EST、本地时区标识),无法匹配时间串尾部代表UTC(祖鲁时间)的单字符标识Z。- 你提供的示例代码还存在基础语法问题:
from datetime import语句未指定导入对象、格式串编写截断,运行时会先抛出语法错误。 - 注意:
%z占位符同样无法匹配单独的Z,该占位符仅支持识别±HHMM格式的时区偏移值(比如+0800、-0500)。
正确解析方法
根据使用的Python版本和时区需求,选以下任意一种方案即可:
方案1:固定匹配Z字符(全版本兼容,最简便)
由于该格式下尾部Z是固定值,直接把Z作为固定字符写入格式串即可,不需要用时区占位符:
from datetime import datetime time_str = "2019-11-14T03:41:12.869000Z" dt = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") # 拆分日期、时间部分 date_part = dt.date() time_part = dt.time()
方案2:保留UTC时区信息(Python 3.2+支持)
如果需要生成带时区属性的时间对象,可以先剥离尾部Z解析时间主体,再手动挂载UTC时区:
from datetime import datetime, timezone time_str = "2019-11-14T03:41:12.869000Z" dt_utc = datetime.strptime( time_str.rstrip("Z"), "%Y-%m-%dT%H:%M:%S.%f" ).replace(tzinfo=timezone.utc)
方案3:内置ISO解析(Python 3.11+支持,无需手写格式串)
Python 3.11版本对fromisoformat方法做了升级,原生支持带Z后缀的ISO8601格式时间串,不需要手动编写格式匹配串:
from datetime import datetime dt = datetime.fromisoformat("2019-11-14T03:41:12.869000Z")
内容的提问来源于stack exchange,提问作者Rachit
相关产品推荐
相关产品推荐

