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

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反而失效了?


问题排查与解决方案

后来这位同学自己仔细检查后,发现代码里藏着两个关键问题,修正后就正常运行了:

  1. 缺失T分隔符:原时间字符串里日期和时间部分是用T分隔的(比如2025-03-24T07:01:53+00:00),但原始格式字符串%Y-%m-%d%X%:z里没有包含T,导致解析时无法正确区分日期和时间段,这是匹配失败的第一个原因。

  2. 错误使用%: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:09:33