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

Python datetime转换带时区字符串为UTC格式时丢失时区信息的问题

问题解答

为什么%Z和%z没效果?

  • strptime解析%Z时,仅会识别时区名称(如EST),但不会将生成的datetime对象标记为「时区感知(timezone-aware)」,仍然是「无时区信息(naive)」的对象。
  • %z格式化符仅对时区感知的datetime对象有效,无时区信息的对象使用%z会输出空内容。
  • 此外,Python标准库对%Z的支持依赖系统本地的时区数据库,部分时区名称(如EST)可能无法被正确映射到对应的UTC偏移值,导致即使解析成功也无法获取偏移信息。

解决方法

方法1:使用Python3.9+内置的zoneinfo模块

先解析出无时区的datetime对象,再手动为其指定对应时区,转换为时区感知对象后再格式化输出:

import datetime
from zoneinfo import ZoneInfo

datetime_string_raw = "18 Nov 2022 08:57:04 EST"
# 先解析出无时区信息的datetime
dt_naive = datetime.datetime.strptime(datetime_string_raw, "%d %b %Y %X %Z")
# 为其添加对应时区(EST对应完整时区标识符为America/New_York)
dt_aware = dt_naive.replace(tzinfo=ZoneInfo("America/New_York"))
# 格式化输出
print(dt_aware.strftime("%Y-%m-%dT%X%z"))
# 输出:2022-11-18T08:57:04-0500

方法2:使用pytz模块(兼容旧版Python)

如果使用Python3.9以下版本,可以安装pytz库来处理:

import datetime
import pytz

datetime_string_raw = "18 Nov 2022 08:57:04 EST"
dt_naive = datetime.datetime.strptime(datetime_string_raw, "%d %b %Y %X %Z")
# 指定EST对应的完整时区
tz = pytz.timezone("America/New_York")
dt_aware = tz.localize(dt_naive)
print(dt_aware.strftime("%Y-%m-%dT%X%z"))
# 输出:2022-11-18T08:57:04-0500

注意事项

  • 时区缩写(如EST)存在歧义(比如EST同时指代北美东部标准时间和澳大利亚东部标准时间),建议使用完整时区标识符(如America/New_York)避免错误。
  • 若系统时区数据库不全,使用zoneinfo时需额外安装tzdata包(执行pip install tzdata)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:45:41