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
相关产品推荐
相关产品推荐

