You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python datetime时区偏移异常:为何时区偏移非整小时?

为什么pytz生成的datetime时区偏移不是整小时?

问题原因

直接将pytz.timezone()返回的时区对象传入datetime的tzinfo参数是错误用法。pytz的时区对象包含历史时区规则,美国东部、太平洋时区在早期(19世纪末)的偏移并非整小时(你看到的-04:56、-07:53就是当时的偏移值),而datetime初始化时不会自动匹配当前时区规则,只会读取时区对象的原始偏移数据。

正确解决方法

方法1:使用pytz的localize()方法绑定时区

import pytz
from datetime import datetime

eastern_timezone = pytz.timezone("US/Eastern")
pacific_timezone = pytz.timezone("US/Pacific")

# 通过localize应用正确的时区规则
dt1 = eastern_timezone.localize(datetime(2023, 1, 1, 11, 0, 0, 0))
dt2 = pacific_timezone.localize(datetime(2023, 1, 1, 8, 0, 0, 0))

print(dt1)  # 输出:2023-01-01 11:00:00-05:00
print(dt2)  # 输出:2023-01-01 08:00:00-08:00
print(dt1 - dt2)  # 输出:datetime.timedelta(0)

方法2:Python3.9+推荐使用内置zoneinfo模块

无需安装第三方库,zoneinfo的时区对象可直接安全传入datetime的tzinfo参数:

from zoneinfo import ZoneInfo
from datetime import datetime

eastern_timezone = ZoneInfo("US/Eastern")
pacific_timezone = ZoneInfo("US/Pacific")

dt1 = datetime(2023, 1, 1, 11, 0, 0, 0, tzinfo=eastern_timezone)
dt2 = datetime(2023, 1, 1, 8, 0, 0, 0, tzinfo=pacific_timezone)

print(dt1)  # 输出:2023-01-01 11:00:00-05:00
print(dt2)  # 输出:2023-01-01 08:00:00-08:00
print(dt1 - dt2)  # 输出:datetime.timedelta(0)

总结

  • pytz时区对象不能直接赋值给datetime的tzinfo,必须通过localize方法匹配对应时间的时区规则;
  • Python3.9及以上版本优先用内置zoneinfo,用法更直观且避免历史时区数据的干扰。

内容的提问来源于stack exchange,提问作者LXJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:04