如何在Python 3.9中转换RFC 2822格式时间的时区为PDT?
Python 3.9 下RFC 2822格式时间转PDT时区实现方案
注意:不存在“解析前转换时区”的可行方案,原始RFC 2822字符串绑定了UTC时区偏移,直接修改字符串末尾的时区标记会导致时间值错误。正确逻辑是先解析为带时区信息的datetime对象,转PDT时区后,可按需再格式化为RFC 2822标准的PDT时间字符串。
实现步骤
- 用Python标准库
email.utils的parsedate_to_datetime方法直接解析原始RFC 2822字符串,得到带UTC时区的datetime对象 - 用Python 3.9原生支持的
zoneinfo模块加载PDT对应时区,调用astimezone完成时区转换 - 若需要转回RFC 2822格式的PDT字符串,用
email.utils.format_datetime格式化即可
完整示例代码
from email.utils import parsedate_to_datetime, format_datetime from zoneinfo import ZoneInfo # 原始RFC 2822格式时间 raw_time_str = "Wed, 06 Oct 2021 23:45:05 +0000 (UTC)" # 解析为带UTC时区的datetime对象 utc_dt = parsedate_to_datetime(raw_time_str) # 转换为PDT时区(自动适配夏令时/冬令时偏移,无需手动写-7小时的固定偏移) pdt_dt = utc_dt.astimezone(ZoneInfo("America/Los_Angeles")) # 可选:转换为RFC 2822格式的PDT字符串 pdt_rfc_str = format_datetime(pdt_dt) # 输出验证 print(f"UTC时间:{utc_dt}") print(f"PDT时间:{pdt_dt}") print(f"PDT格式的RFC 2822字符串:{pdt_rfc_str}")
运行输出示例
UTC时间:2021-10-06 23:45:05+00:00 PDT时间:2021-10-06 16:45:05-07:00 PDT格式的RFC 2822字符串:Wed, 06 Oct 2021 16:45:05 -0700
注意事项
- 不要手动用
timedelta(hours=-7)做固定偏移,ZoneInfo("America/Los_Angeles")会自动判断时间属于PDT(夏令时UTC-7)还是PST(冬令时UTC-8),避免时区切换期的时间错误 - 如果运行时报时区找不到的错误,直接用pip安装
tzdata依赖即可
内容的提问来源于stack exchange,提问作者ninsonTan
相关产品推荐
相关产品推荐

