Java 新时间 API 编译并在 运行 时间中断

Java new time API compiles and break at run time

我正在尝试始终使用 Java 8 日期时间 API,我正在寻找此行为背后的解释:

Instant.from(LocalDateTime.of(2017,01,01,0,0,0,0))

编译得很好,但会产生:

Exception in thread "main" java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: 2017-01-01T00:00 of type java.time.LocalDateTime

我的问题是:如果这些类型不兼容,为什么 API 让我编码并编译它而不用尖叫?

它编译得很好,因为 Instant.from(TemporalAccessor temporal) accepts a TemporalAccessor and LocalDateTimeTemporalAccessor 的子类。

在运行时你会得到一个异常,因为要创建一个 InstantTemporalAccessor 必须有字段 INSTANT_SECONDS and NANO_OF_SECOND,但是 LocalDateTime 不提供 INSTANT_SECONDS 只有 NANO_OF_SECOND.

要更好地使用 LocalDateTime 创建 Instant(例如):

LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zoneId).toInstant();

LocalDateTime localDateTime = LocalDateTime.now();
Instant instant = localDateTime.toInstant(ZoneOffset.ofHours(0));