Python 中处理时区与夏令时有更优雅的方法吗?
场景:采集加拿大过来的数据是加拿大的时区,加拿大每年会有东夏令时切换。抓取到的数据存储到数据库时是以北京时间存储的。但是每次到了东夏令时的切换,会导致插入的时间少了一个小时或者多一个小时。
假设将采集的数据转为 UTC 存储到数据库中,在取数据时转换为当地时间是不是更为妥当一些?
Python 中处理时区与夏令时有更优雅的方法吗?
6 回复
储存为 timestamp 更合适吧
用 pytz 或 zoneinfo 库处理时区是标准做法,但确实有更优雅的方式。Python 3.9+ 内置了 zoneinfo 模块,结合 datetime 可以很干净地处理时区转换和夏令时。
from datetime import datetime
from zoneinfo import ZoneInfo
# 创建带时区的时间
local_time = datetime(2024, 7, 15, 14, 30, tzinfo=ZoneInfo("America/New_York"))
print(f"纽约时间: {local_time}")
# 转换到其他时区
utc_time = local_time.astimezone(ZoneInfo("UTC"))
print(f"UTC时间: {utc_time}")
# 处理夏令时转换
# 纽约时间 2024-03-10 01:59:59(标准时间)到 03:00:00(夏令时)
dt_before = datetime(2024, 3, 10, 1, 59, 59, tzinfo=ZoneInfo("America/New_York"))
dt_after = datetime(2024, 3, 10, 3, 0, 0, tzinfo=ZoneInfo("America/New_York"))
print(f"转换前: {dt_before} (UTC: {dt_before.astimezone(ZoneInfo('UTC'))})")
print(f"转换后: {dt_after} (UTC: {dt_after.astimezone(ZoneInfo('UTC'))})")
# 检查是否在夏令时
print(f"是否夏令时: {dt_after.dst() != None}")
zoneinfo 的好处是:
- 内置库,不需要额外安装
- 自动处理夏令时转换
- 使用IANA时区数据库,数据准确
- 语法简洁直观
对于老版本Python,可以用 pytz,但要注意它的 localize() 方法:
import pytz
from datetime import datetime
tz = pytz.timezone('America/New_York')
dt = tz.localize(datetime(2024, 7, 15, 14, 30))
建议升级到Python 3.9+直接用 zoneinfo,这是目前最优雅的方案。
存储用 utc 、展现用当地时区是金科玉律
timestamp 不能处理闰秒
多谢,学习了,之前想当然了
大概是以 Unix 时间戳更便利吧? thx
no

