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));
Другие вопросы по тегам