使用 ZoneId.systemDefault() 将 java.util.Date 转换为 java.time.Loc



我在将java.util.Date转换为java.time.LocalDateTime时遇到问题,并且在时区方面产生了非常奇怪的影响:

Date date = new Date(-3155677200000L); // 1870-01-01T00:00:00.000+0100
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); // 1869-12-31T23:53:28

时间真的很差。 6分32秒,这很烦人,因为它在这里还改变了日期甚至年份。

它与ZoneId.systemDefault()有关,如果我使用ZoneOffset它就可以工作。

为什么?这是JDK中的错误吗?似乎只发生在 1893 年之前的日期。

ZoneId.systemDefault()是欧洲/柏林(欧洲中部时间,+01:00)

同样地:

ZonedDateTime zonedDateTime = LocalDateTime.of(1870, 1, 1, 0, 0, 0, 0).atZone(ZoneId.systemDefault());

指纹:

1870-01-01T00:00+00:53:28[Europe/Berlin]

预期成果:

1870-01-01T00:00+01:00:00[Europe/Berlin]

根据 IANA 规则,转换是正确的。欧洲/柏林规则以以下行开头:

Zone    Europe/Berlin   0:53:28 -   LMT 1893 Apr
您从 1869-12-31T23:

00:00Z 开始,因此本地时间是 1869-12-31T23:53:28。

这里没有错误 - 只是一个错误的期望。

相关内容

  • 没有找到相关文章

最新更新