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

时间:2017-12-08 08:51:48

标签: java datetime jsr310

我正在尝试使用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让我编写代码并编译它而不会尖叫?

1 个答案:

答案 0 :(得分:4)

它编译得很好,因为Instant.from(TemporalAccessor temporal)接受TemporalAccessorLocalDateTimeTemporalAccessor的子类。

在运行时,您会收到异常,因为要创建InstantTemporalAccessor必须包含字段INSTANT_SECONDSNANO_OF_SECOND,但LocalDateTime不会t仅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));