Ошибка Java Instant?`DateTimeException: недопустимое значение для года` - PullRequest
0 голосов
/ 26 февраля 2019

Согласно документации для Instant , минимальное значение Instant * равно -1000000000-01-01T00:00Z, поэтому год равен -1000000000, а часовой пояс равен UTC.поэтому я ожидал, что эта программа будет работать, а atOffset будет noop:

import java.time.*;

public class A {
   public static void main(String[] args) {
      Instant i = Instant.MIN;
      System.out.println(i);
      System.out.println(i.atOffset(ZoneOffset.UTC));
   }
}

Но вместо этого он выдает это исключение для atOffset:

-1000000000-01-01T00:00:00Z
Exception in thread "main" java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): -1000000000
        at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)
        at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)
        at java.time.LocalDate.ofEpochDay(LocalDate.java:341)
        at java.time.LocalDateTime.ofEpochSecond(LocalDateTime.java:422)
        at java.time.OffsetDateTime.ofInstant(OffsetDateTime.java:328)
        at java.time.Instant.atOffset(Instant.java:1195)
        at A.main(A.java:7)

Жук?Согласно сообщению этой проверки, минимальный год составляет -999999999, но в документации говорится, что это -1000000000.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

i.atOffset(ZoneOffset.UTC)

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

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

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

0 голосов
/ 26 февраля 2019

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

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

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

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

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

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

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

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

...