Java LocalDate不接受所有EpochDay字段有效值

时间:2018-09-19 16:04:23

标签: java date datetime

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时间策略是通过ValueRange方法通过TemporalField向其自己的Temporal查询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,否则为什么在范围内多长时间?

InstantINSTANT_SECONDS字段中也会发生同样的情况:Instant.ofEpochSecond(ChronoField.INSTANT_SECONDS.rangeRefinedBy(Instant.now()).getMinimum());

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

似乎至少是Java 8 Update 181中的错误,至少是由Java 10修复的。

Java 10-Pass

Java 10.0.2Zulu JVMAzul SystemsmacOS High Sierra上为我工作。

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

-999999999-01-01

Java 8-失败

在Java 1.8.0_181上,在Zulu JVM上由Azul SystemsmacOS High Sierra引发异常。

  

线程“ main”中的异常java.time.DateTimeException:Year的无效值(有效值-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:341)

LocalDate.java文件中,有问题的行似乎是#341。

int year = YEAR.checkValidIntValue(yearEst);

...其中yearEst是-1000018564