Java LocalDate не принимает все допустимые значения поля EpochDay - PullRequest
0 голосов
/ 19 сентября 2018
LocalDate.ofEpochDay(ChronoField.EPOCH_DAY.range().getMinimum());

Этот код, приведенный выше, заканчивается следующей брошенной трассировкой стека:

java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): -1000018564
  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)

Я не понял, почему эта инструкция не поддерживается.

На самом деле стратегия времени java - это запроссобственный Temporal его ValueRange для TemporalField до range (TemporalField) метода.И в этом случае LocalDate не изменяет диапазон значений по умолчанию для поля EpochDay.

@Override
public ValueRange range(TemporalField field) {
    if (field instanceof ChronoField) {
        ChronoField f = (ChronoField) field;
        if (f.isDateBased()) {
            switch (f) {
                case DAY_OF_MONTH: return ValueRange.of(1, lengthOfMonth());
                case DAY_OF_YEAR: return ValueRange.of(1, lengthOfYear());
                case ALIGNED_WEEK_OF_MONTH: return ValueRange.of(1, getMonth() == Month.FEBRUARY && isLeapYear() == false ? 4 : 5);
                case YEAR_OF_ERA:
                    return (getYear() <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE));
            }
            return field.range();
        }
        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }
    return field.rangeRefinedBy(this);
}

Допустимые значения поля EpochDay должны быть преобразованы в LocalDate, в противном случае, почему он находится в диапазоне?

То же самое происходит с полями Instant и INSTANT_SECONDS: Instant.ofEpochSecond(ChronoField.INSTANT_SECONDS.rangeRefinedBy(Instant.now()).getMinimum());

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 19 сентября 2018

Кажется, что это ошибка в Java 8 Update 181 как минимум, исправлена ​​как минимум в Java 10.

Java 10 - Pass

Работает для меня, Java 10.0.2, Zulu JVM от Azul Systems , на macOS High Sierra .

LocalDate ld = 
    LocalDate.ofEpochDay( 
        ChronoField.EPOCH_DAY.range().getMinimum() 
    )
;
System.out.println( ld );

-999999999-01-01

Java 8 - Fail

Выдает исключение на Java 1.8.0_181, Zulu JVM на Azul Systems , на macOS High Sierra .

Исключение в потоке "main" java.time.DateTimeException: недопустимое значение для года (допустимые значения -999999999 - 999999999): -1000018564 в java.time.temporal.ValueRange.checkValidIntValue (ValueRange.java:330) в java.time.temporal.ChronoField.checkValidIntValue (ChronoField.java:722) в java.time.LocalDate.ofEpochDay (LocalDate.java:34 10 * 10 * 10 * 10 * 10 * 10) 10* Кажется, что в файле LocalDate.java нарушена строка # 341.

int year = YEAR.checkValidIntValue(yearEst);

… где yearEst равно -1000018564

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...