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
相关产品推荐
相关产品推荐

