Java转换同日期正负纪年CET ZonedDateTime时UTC偏移量不一致问题
偏移量差异的根本原因如下:
Java的时区逻辑完全基于IANA时区数据库(TZDB)的公开规则,并非Java官方单独定制的逻辑,两个时间点命中了不同的偏移规则:
- 对于
2001-10-26处于现代夏令时规则生效区间
CET(中欧时区)自1996年起统一执行欧盟夏令时规定:每年3月最后一个周日至10月最后一个周日执行夏令时,偏移为+2(CEST,中欧夏令时),其余时段执行标准时,偏移为+1(CET,中欧标准时)。2001年10月的最后一个周日为28日,26日仍在夏令时区间内,因此偏移量为+02:00。 - 对于
-2001-10-26(公元前2001年10月26日)属于无明确时区规则的历史时段
夏令时制度是20世纪才逐步推广的规则,公元前不存在任何夏令时执行记录。IANA时区数据库对所有早于当地最早时区规则记录的时间点,统一采用对应时区的标准偏移量作为默认值,CET的标准偏移固定为+1,因此该时间点偏移量为+01:00。
关于你提到的UTC概念尚未定义的历史时间点的处理:IANA时区数据库对这类时段做了统一的兼容约定,所有无明确规则记录的历史时间,要么使用推算的本地平均时间,要么直接沿用该时区的标准偏移量,不会出现规则空白,因此Java可以直接从内置的TZDB中读取到对应的偏移值,不需要单独做特殊自定义规则。
内容的提问来源于stack exchange,提问作者jlm1150
相关产品推荐
相关产品推荐

