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

使用strptime()转换带时区时间字符串报错,求解决方案

问题:datetime.strptime无法解析带7位小数和时区的时间字符串

尝试执行以下代码:

time_str = "20:52:30.0000000+02:00"
time = datetime.strptime(time_str, "%H:%M:%S.%f%z")

出现错误:

ValueError: time data '20:52:30.0000000+02:00' does not match format '%H:%M:%S.%f%z'

已查阅大量StackOverflow帖子仍未找到正确格式,请问当前输入格式能否直接转换?

编辑补充:
根据建议将时区改为0200而非02:00后,执行代码:

time_str = "20:52:30.0000000+0200"
time = datetime.strptime(time_str, "%H:%M:%S.%f%z")

仍出现相同错误:

ValueError: time data '20:52:30.0000000+0200' does not match format '%H:%M:%S.%f%z'

解决方案

问题根源

  1. 微秒位数超限:strptime的%f格式符仅支持最多6位微秒,输入的0000000是7位,超出了解析范围。
  2. 时区格式兼容问题:旧版Python中strptime的%z不支持带冒号的时区格式(如+02:00),即便改成+0200,微秒位数的问题仍会导致报错。

可行方案

方案1:手动处理字符串后用strptime解析

截断多余的微秒位,同时调整时区格式为±HHMM,再进行解析:

from datetime import datetime

time_str = "20:52:30.0000000+02:00"
# 截取前6位微秒,去掉时区中的冒号
processed_str = f"{time_str[:20]}{time_str[21:].replace(':', '')}"
dt = datetime.strptime(processed_str, "%H:%M:%S.%f%z")
print(dt)

方案2:使用fromisoformat(Python 3.7+推荐)

fromisoformat原生支持带冒号的时区格式,且会自动截断超过6位的微秒,无需手动调整:

from datetime import datetime

time_str = "20:52:30.0000000+02:00"
dt = datetime.fromisoformat(time_str)
print(dt)

内容的提问来源于stack exchange,提问作者stitch123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:35:19