Python 3.13使用strptime解析带时区时间字符串报错:':'是格式中的无效指令
Python 3.13使用strptime解析带时区时间字符串报错:':'是格式中的无效指令
问题描述
有同学在Python里尝试解析HTML风格的时间字符串时遇到了棘手的报错,先来看他的原始代码:
from datetime import datetime input = "2025-03-24T07:01:53+00:00" output = datetime.strptime(input, "%Y-%m-%d%X%:z") print(output)
在Python 3.13中运行这段代码后,直接抛出了以下错误:
Traceback (most recent call last): File "/Users/dread_pirate_roberts/html_time_converter/main.py", line 69, in <module> output = datetime.strptime(input, "%Y-%m-%d%X%:z") File "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/_strptime.py", line 674, in _strptime_datetime tt, fraction, gmtoff_fraction = _strptime(data_string, format) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/_strptime.py", line 445, in _strptime raise ValueError("'%s' is a bad directive in format '%s'" % (bad_directive, format)) from None ValueError: ':' is a bad directive in format '%Y-%m-%d%X%:z'
这让他十分困惑,因为他明明记得%:z是Python 3.12就新增的格式指令,专门用来匹配带冒号的时区偏移(比如+00:00),怎么到3.13反而失效了?
问题排查与解决方案
后来这位同学自己仔细检查后,发现代码里藏着两个关键问题,修正后就正常运行了:
缺失
T分隔符:原时间字符串里日期和时间部分是用T分隔的(比如2025-03-24T07:01:53+00:00),但原始格式字符串%Y-%m-%d%X%:z里没有包含T,导致解析时无法正确区分日期和时间段,这是匹配失败的第一个原因。错误使用
%:z指令:这里的核心误解是——%:z其实是strftime的输出指令(用来生成带冒号的时区偏移字符串),而在strptime解析时,%z指令本身就支持匹配带冒号或不带冒号的时区偏移格式(不管是+0000还是+00:00都能识别)。所以原始格式里的%:z是错误写法,这才触发了“':'是无效指令”的报错。
修正后的可运行代码
from datetime import datetime input = "2025-03-24T07:01:53+00:00" output = datetime.strptime(input, "%Y-%m-%dT%X%z") print(output)
运行这段代码后,就能成功解析目标时间字符串,输出结果为2025-03-24 07:01:53+00:00。
备注:内容来源于stack exchange,提问作者user12532589
相关产品推荐
相关产品推荐

