Python 中处理时区与夏令时有更优雅的方法吗?

场景:采集加拿大过来的数据是加拿大的时区,加拿大每年会有东夏令时切换。抓取到的数据存储到数据库时是以北京时间存储的。但是每次到了东夏令时的切换,会导致插入的时间少了一个小时或者多一个小时。

假设将采集的数据转为 UTC 存储到数据库中,在取数据时转换为当地时间是不是更为妥当一些?


Python 中处理时区与夏令时有更优雅的方法吗?
6 回复

储存为 timestamp 更合适吧


pytzzoneinfo 库处理时区是标准做法,但确实有更优雅的方式。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 的好处是:

  1. 内置库,不需要额外安装
  2. 自动处理夏令时转换
  3. 使用IANA时区数据库,数据准确
  4. 语法简洁直观

对于老版本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

回到顶部