Ошибка Java Instant? `DateTimeException: недопустимое значение для года`

Несмотря на то, что исходный вопрос был опубликован 5 лет назад, проблема все еще сохраняется и довольно раздражает.

Общее решение - это тщательный анализ всех ссылочных ассемблеров, чтобы понять, что происходит не так. Чтобы упростить эту задачу, я создал инструмент (расширение Visual Studio), который позволяет выбирать сборку .Net (.ddl или .exe-файл) и получать график всех ссылочных ассемблеров с прорисованными конфликтующими или пропущенными ссылками.

Инструмент доступен в галерее Visual Studio: https://marketplace.visualstudio.com/vsgallery/051172f3-4b30-4bbc-8da6-d55f70402734

Пример вывода:

0
задан MondKin 26 February 2019 в 20:51
поделиться

2 ответа

atOffset возвращает значение OffsetDateTime , которое имеет другое значение Мин / Макс.

Минимальный поддерживаемый OffsetDateTime, '-999999999-01-01T00: 00: 00 + 18: 00'.

Максимально поддерживаемое значение OffsetDateTime, '+ 999999999-12-31T23: 59: 59.999999999-18: 00'.

В javadoc упоминается, что эти минимальные / максимальные значения получены из LocalDateTime вместе с максимальными смещениями зоны, поэтому кажется, что они не совпадают до Instant

Причина, по которой у Мгновенного есть дополнительный год в обе стороны, согласно документации Мгновенное .

Это на год раньше минимального LocalDateTime. Это обеспечивает достаточные значения для обработки диапазона ZoneOffset, которые влияют на момент в дополнение к локальной дате и времени. Значение также выбирается таким образом, чтобы значение года помещалось в целое число.

Охватывает крайний случай, когда LocalDateTime + Offset приводит к времени предыдущего года.

Максимальным практическим значением будет минимальное значение OffsetDateTime, преобразованное в мгновенное значение, поскольку все, что находится до этой даты, является буфером, для которого нет эквивалентного OffsetDateTime.

0
ответ дан Compass 26 February 2019 в 20:51
поделиться

Это не ошибка, на самом деле действие вызова

i.atOffset(ZoneOffset.UTC)

запускает создание объекта OffsetDateTime, который javadoc четко утверждает следующее

Минимальный поддерживаемый OffsetDateTime, '-999999999-01-01T00: 00: 00 + 18: 00'.

Так что, в принципе, если вы сохраните его Instant, это нормально, но попытка изменить его может вызвать проблему

0
ответ дан Yassin Hajaj 26 February 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: