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 LocalDateTime
是 TemporalAccessor
的子类。
在运行时你会得到一个异常,因为要创建一个 Instant
,TemporalAccessor
必须有字段 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));
我正在尝试始终使用 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 LocalDateTime
是 TemporalAccessor
的子类。
在运行时你会得到一个异常,因为要创建一个 Instant
,TemporalAccessor
必须有字段 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));