API нового времени Java компилируется и прерывается во время выполнения
Я пытаюсь последовательно использовать API даты и времени Java 8, я ищу объяснения этому поведению:
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 ответ
Решение
Компилируется нормально, потому что Instant.from(TemporalAccessor temporal)
принимает TemporalAccessor и LocalDateTime
это подкласс от TemporalAccessor
,
Во время выполнения вы получаете исключение, потому что для создания Instant
TemporalAccessor
должны иметь поля INSTANT_SECONDS
а также NANO_OF_SECOND
, но LocalDateTime
не обеспечивает INSTANT_SECONDS
только NANO_OF_SECOND
,
Чтобы лучше создать Instant из LocalDateTime (например):
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));