为什么java中的Instant date显示1884年之前给定日期的时间4:56:02Z

为什么java中的Instant date显示1884年之前给定日期的时间4:56:02Z,java,Java,对于我的工作,我想根据给定的ZoneID获得给定日期的即时日期,一切正常,但当我检查1883年或之前的旧日期时。时间显示为04:56,而不是5:00 对于1883年11月18日之后的任何日期,它都会给出正确的结果,如1883-11-19T05:00:00Z 有人能帮上忙吗?为什么对于较老的日期,时间显示为4:56 public static String firstdate = "18831118"; LocalDate localFirstDate = LocalDate.parse(fir

对于我的工作,我想根据给定的ZoneID获得给定日期的即时日期,一切正常,但当我检查1883年或之前的旧日期时。时间显示为04:56,而不是5:00

对于1883年11月18日之后的任何日期,它都会给出正确的结果,如1883-11-19T05:00:00Z

有人能帮上忙吗?为什么对于较老的日期,时间显示为4:56

public static String firstdate = "18831118";

LocalDate localFirstDate = LocalDate.parse(firstdate, DateTimeFormatter.ofPattern("yyyyMMdd"));
LocalDateTime localDateTime = localFirstDate.atStartOfDay();
Instant instantFirstDate = localDateTime.toInstant(ZoneId.of("America/New_York").getRules().getOffset(localDateTime));
输出

1883-11-18T04:56:02Z
1883-11-19T05:00:00Z
输出

1883-11-18T04:56:02Z
1883-11-19T05:00:00Z
在后一种情况下,假设localDateTime声明为localDateTime localDateTime=localFirstDate.atStartOfDay,则它完美地显示了时间5:00:00Z

如果查看ZoneId.ofAmerica/New_York.getRules.getOffsetlocalDateTime返回的内容,您将看到它的偏移量约为-4:56。使用此偏移量计算实例,因此它们的时间为04:56

为什么纽约在1883年11月17日之前有如此奇怪的时区偏移?显然,11月18日。很容易想象,在该日期之前,没有关于小时时区的标准

如果你看看其他时区,比如亚洲/澳门,你会发现它们中的大多数在一百多年前都有奇怪的偏移量。搞乱时区是我们人类做的一件很自然的事


在您的具体案例中,如果您想在1883年11月18日之前使用标准化时区偏移,您可以只应用从ZoneId.ofAmerica/New_York.getRules.getTransitionRules手动获取的ZoneOffsetTransitionRule,但我不确定这有多大意义

嗨,谢谢你的意见。我会设法处理抵消问题。