如何将字符串格式的日期时间转换为 ISO 8601 标准格式

本文详解如何在 python 中将数据库返回的 `'yyyy-mm-dd hh:mm:ss'` 类型字符串(如 `'2025-01-26 00:39:24'`)安全、准确地解析并转换为符合 sitemap `` 要求的 iso 8601 格式(如 `'2025-01-26t00:39:24+03:30'`),支持时区自动推断与微秒截断。

在构建 Python 网站地图(sitemap)生成器时, 标签必须严格遵循 ISO 8601 标准,例如 2025-01-26T00:39:24+03:30(带时区偏移、无微秒)。而 MySQL 的 TIMESTAMP() 函数默认返回不带时区的字符串(如 '2025-01-26 00:39:24'),直接使用 datetime.strptime() 需显式指定格式且无法自动处理时区,易出错。

推荐使用 dateutil.parser.parse() —— 它能智能识别多种常见日期字符串格式,并默认将无时区时间解释为本地系统时区,再通过 .astimezone() 统一转换为本地时区带偏移的 datetime 对象,最后调用 .isoformat() 生成标准 ISO 字符串。

✅ 正确示例代码如下:

from dateutil import parser
import datetime

# 假设这是从 MySQL 查询得到的时间字符串
db_timestamp = "2025-01-26 00:39:24"

# 步骤1:解析字符串为 naive datetime(无时区)
dt_naive = parser.parse(db_timestamp)

# 步骤2:绑定本地时区并标准化为带偏移的 aware datetime
dt_aware = dt_naive.astimezone()

# 步骤3:去除微秒(Sitemap 规范要求秒级精度)
dt_clean = dt_aware.replace(microsecond=0)

# 步骤4:输出 ISO 8601 格式(含时区,如 2025-01-26T00:39:24+03:30)
iso_lastmod = dt_clean.isoformat()
print(iso_lastmod)  # 输出示例:2025-01-26T00:39:24+03:30

⚠️ 注意事项:

  • 依赖安装:需先执行 pip install python-dateutil;
  • 时区逻辑:parser.parse() 对无时区输入默认视为本地时间(非 UTC),再经 .astimezone() 转换为当前系统时区的带偏移表示。若数据库实际存储的是 UTC 时间,请改用 .replace(tzinfo=datetime.timezone.utc).astimezone() 显式声明;
  • 生产建议:对于高一致性要求场景(如多服务器部署),推荐在数据库连接层统一配置时区(如 SET time_zone = '+00:00'),并在 Python 中显式按 UTC 解析,避免依赖本地系统时区;
  • 替代方案(无第三方依赖):若不能引入 dateutil,可使用 datetime.strptime() + datetime.now().astimezone().tzinfo 手动附加时区,但代码更冗长且容错性低。

总结:dateutil.parser.parse() 是处理不规范日期字符串的首选工具;结合 .astimezone().replace(microsecond=0).isoformat() 三步链式调用,即可稳定输出 Sitemap 兼容的 ISO 8601 值,兼顾简洁性、可读性与健壮性。