技术科普

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,并明确区分“瞬间”和“本地时间”。