zoneinfo:保存事件时刻,展示地区时间
服务器与用户不在同一个时区时,直接展示无时区 datetime 会产生歧义。事件记录需要能明确定位到时间线上的一点。
问题从哪里出现
服务器与用户不在同一个时区时,直接展示无时区 datetime 会产生歧义。事件记录需要能明确定位到时间线上的一点。
理解核心机制
带时区 datetime 可以通过 astimezone 转换显示地区。ZoneInfo 使用地区规则而不只是固定偏移;夏令时切换附近还需要理解重复时间与 fold。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
event = datetime(2026, 1, 1, tzinfo=timezone.utc)
local = event.astimezone(ZoneInfo("Asia/Shanghai"))
assert local.hour == 8
assert local.timestamp() == event.timestamp()
print(local.isoformat())适用边界与常见误区
系统需要可用的时区数据库。给无时区对象直接 replace(tzinfo=...) 是附加解释,不是时间转换;对未知来源的本地时间不能这样猜测时区。
继续练习
比较同一个时刻在两个地区的 ISO 文本和 timestamp,再测试具有夏令时的地区,记录重复当地时间如何消歧。