技术科普
Python 时区处理:pytz 与 zoneinfo 对比
Python 的 datetime 模块支持时区,但早期标准库缺少完整的 IANA 时区数据库,长期依赖第三方库 pytz。Python 3.9 起,标准库加入 zoneinfo。
pytz 的用法
pytz 要求使用 localize() 绑定时区,而不是直接传给 tzinfo:
tz = pytz.timezone('Asia/Shanghai')
dt = tz.localize(datetime(2026, 1, 1, 12, 0))
直接构造可能导致夏令时处理错误。
zoneinfo 的用法
Python 3.9+ 可直接使用:
from zoneinfo import ZoneInfo
dt = datetime(2026, 1, 1, 12, 0, tzinfo=ZoneInfo('Asia/Shanghai'))
更简洁,且与标准库集成更好。
aware 与 naive
- naive datetime 不含时区,不能安全比较或换算
- aware datetime 带 tzinfo,可正确表示瞬间
- 跨时区计算应统一转换为 UTC
- 处理夏令时重叠时可用
fold参数
迁移建议
新项目优先使用 zoneinfo;旧项目可逐步替换 pytz。无论哪种方案,都应安装最新 tzdata 包,并避免手动加减小时。
Python 时区处理的关键是始终使用 aware datetime,并明确区分“瞬间”和“本地时间”。