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

Python解析带UTC时区字符串生成时区感知datetime的问题

关于Python时间戳解析的差异及解决方案

两种解析方式的差异原因

1. %Z格式的行为

使用datetime.datetime.strptime("2022-10-20 13:13:13 UTC", "%Y-%m-%d %H:%M:%S %Z")时,%Z的作用仅仅是验证输入字符串中的时区名称是否是系统可识别的标识(比如UTC属于标准可识别的,所以不会报错),但Python标准库的strptime并不会为解析出的datetime对象设置tzinfo属性——这是它的设计逻辑,%Z只做格式匹配,不处理时区信息的绑定。

2. %z格式的行为

而%z是专门匹配UTC偏移量格式(如+00:00、-0500)的格式符,解析时会自动将偏移量转换为对应的datetime.timezone对象,并赋值给结果的tzinfo属性,所以能得到时区感知的datetime对象。

你提到的Python文档技术说明#6,应该是指格式匹配规则(比如%Z能匹配UTC这类名称),但它并没有承诺会为对象添加时区信息,这就是两者结果不同的核心原因。

不用dateutil解析带UTC的字符串方案

如果不想依赖python-dateutil,可以用以下两种方法实现:

方法1:解析后手动添加时区信息

先解析得到naive datetime,再手动为其设置tzinfo:

from datetime import datetime, timezone

dt_str = "2022-10-20 13:13:13 UTC"
dt_naive = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S %Z")
dt_aware = dt_naive.replace(tzinfo=timezone.utc)
# 结果:datetime.datetime(2022, 10, 20, 13, 13, 13, tzinfo=datetime.timezone.utc)

方法2:替换字符串后用%z解析

把字符串中的"UTC"替换为"+00:00",再用%z格式解析:

from datetime import datetime

dt_str = "2022-10-20 13:13:13 UTC"
dt_str_modified = dt_str.replace("UTC", "+00:00")
dt_aware = datetime.strptime(dt_str_modified, "%Y-%m-%d %H:%M:%S %z")
# 结果:datetime.datetime(2022, 10, 20, 13, 13, 13, tzinfo=datetime.timezone.utc)

注意:如果要处理其他时区名称(比如EST、CET),这种手动替换的方法需要维护时区名称到偏移量的映射,但如果只是处理UTC的话,上面两种方法都足够简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:30:53