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

时间:2016-05-27 09:29:29

标签: java datetime timezone java-8

我无法将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()是欧洲/柏林(CET,+ 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]

1 个答案:

答案 0 :(得分:4)

根据IANA规则,转换是正确的。欧洲/柏林规则从这条线开始:

Zone    Europe/Berlin   0:53:28 -   LMT 1893 Apr

您从1869-12-31T23:00:00Z开始,所以当地时间是1869-12-31T23:53:28。

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