You need to enable JavaScript to run this app. Python将带+xxxx时区的ISO日期字符串转date对象,解决fromisoformat报错满足MySQL存储需求
优惠活动
大模型
产品
解决方案
定价
更多

Python将带+xxxx时区的ISO日期字符串转date对象,解决fromisoformat报错满足MySQL存储需求

报错核心原因

Python 3.11 之前的datetime.fromisoformat存在格式兼容缺陷:仅支持解析带冒号分隔的时区偏移(如+11:00),无法识别不带冒号的4位时区格式(如接口返回的+1100),因此触发ValueError: Invalid isoformat string错误。
补充:Python 3.11 及以上版本已原生兼容不带冒号的4位时区偏移格式,如果该版本下仍触发报错,可通过repr(原始日期字符串)检查是否存在隐藏的不可见字符。

可落地解决路径

路径1:字符串预处理后复用fromisoformat

  • 对接口返回的原始日期字符串做轻量修正,将末尾不带冒号的4位时区偏移补全为带冒号的标准ISO格式,再调用原有方法解析
  • 参考实现:
from datetime import datetime
import re

raw_str = "2021-01-29T17:15:46+1100"
# 匹配末尾4位时区段,插入冒号分隔
processed_str = re.sub(r'([+-]\d{2})(\d{2})$', r'\1:\2', raw_str)
# 解析为带时区信息的标准datetime对象
tz_aware_dt = datetime.fromisoformat(processed_str)
# 可独立提取的元素:年、月、日、时分秒、时区信息
year = tz_aware_dt.year
month = tz_aware_dt.month
day = tz_aware_dt.day
time_value = tz_aware_dt.time()
tz = tz_aware_dt.tzinfo

路径2:显式格式匹配直接解析

  • 不依赖fromisoformat的版本兼容特性,使用strptime显式指定输入格式规则,直接匹配4位时区偏移的字符串结构,跨Python版本兼容性更强
  • 参考实现:
from datetime import datetime

raw_str = "2021-01-29T17:15:46+1100"
# 格式串对应输入结构:年-月-日T时:分:秒4位时区偏移
tz_aware_dt = datetime.strptime(raw_str, "%Y-%m-%dT%H:%M:%S%z")
# 后续元素提取逻辑与路径1完全一致
MySQL datetime列适配注意事项
  • MySQL的datetime列本身不存储时区元数据,仅保存纯日期时间数值
  • 如果存储时需要统一使用UTC时间值,可先将带时区的datetime对象转换为UTC时间、剥离时区标识后再提交:
from datetime import datetime, timezone

# 转UTC、移除时区标识,适配MySQL datetime列存储格式
dt_for_mysql = tz_aware_dt.astimezone(timezone.utc).replace(tzinfo=None)
  • 如果需要保留接口返回的原时间数值,直接将转换后的无时区datetime对象传入SQL参数即可,无需额外格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 18:06:07