pytz使用America/New_York时区出现-04:56偏移及DstTzInfo疑问
为什么时区偏移会显示为
-04:56 你看到的-04:56不是纽约时区的有效现代偏移,是pytz错误用法导致的历史偏移值。
问题原因
你用datetime.replace(tzinfo=tz)的方式给时间绑定pytz时区是错误写法:pytz的时区对象不会在replace调用时自动匹配对应时间点的时区规则,直接绑定会默认返回该时区最早的历史偏移记录——也就是1883年美国推行统一标准时区之前,纽约当地使用的本地平均时间(LMT)。
这个LMT的偏移恰好是UTC-4小时56分,对应输出里的-04:56。
正确的pytz时区绑定写法要使用localize()方法:
import pytz, datetime tz = pytz.timezone("America/New_York") t = datetime.datetime(2022, 1,1, 5, 30) u = tz.localize(t) print(u) # 正确输出:2022-01-01 05:30:00-05:00
2022年1月纽约处于冬令时,正确偏移为UTC-5,和上述输出一致。
Jupyter输出字段解释
你看到的datetime.datetime(2022, 1, 1, 5, 30, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)里各字段含义如下:
DstTzInfo:pytz自定义的时区信息类,存储了IANA时区数据库中对应时区的全部规则,包括历史偏移、夏令时切换时间、时区缩写等,是pytz做时间转换的核心数据结构。LMT:是Local Mean Time(本地平均时间)的缩写,是全球统一时区制度落地前,各地根据太阳经度测算的本地时间,没有统一的整小时偏移规则。-1 day, 19:04:00:是偏移量的换算写法,-1天+19小时4分 = -4小时56分,正好对应你看到的-04:56偏移值。STD:是Standard Time(标准时间)的缩写,代表当前偏移属于标准时规则,不属于夏令时(DST)偏移。
补充说明:Python 3.9+版本内置的zoneinfo模块没有pytz的这个设计问题,可以直接用replace(tzinfo=tz)的方式绑定时区,不需要额外调用localize方法。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

