使用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'
解决方案
问题根源
- 微秒位数超限:
strptime的%f格式符仅支持最多6位微秒,输入的0000000是7位,超出了解析范围。 - 时区格式兼容问题:旧版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
相关产品推荐
相关产品推荐

