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

art*_*nrq 5 java datetime date java-8

LocalDate.ofEpochDay(ChronoField.EPOCH_DAY.range().getMinimum());
Run Code Online (Sandbox Code Playgroud)

上面的代码最终抛出以下堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么不支持该指令。

实际上,java时间策略是查询自己的TemporalValueRange以获取TemporalFieldthroughrange (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);
}
Run Code Online (Sandbox Code Playgroud)

EpochDay 字段有效值应该可以转换为LocalDate,否则为什么它在范围内很长?

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

有人能帮助我吗?

Bas*_*que 2

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

\n\n

Java 10 - 通过

\n\n

适用于我,Java 10.0.2Azul SystemsZulu JVM,在macOS High Sierra上。

\n\n
LocalDate ld = \n    LocalDate.ofEpochDay( \n        ChronoField.EPOCH_DAY.range().getMinimum() \n    )\n;\nSystem.out.println( ld );\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

-999999999-01-01

\n
\n\n

Java 8 - 失败

\n\n

macOS High Sierra上的 Java 1.8.0_181、 Azul SystemsZulu JVM上引发异常。

\n\n
\n

线程“main”中的异常 java.time.DateTimeException:年份值无效(有效值 -999999999 - 999999999):-1000018564\n 在 java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)\n 在 java .time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)\n 在 java.time.LocalDate.ofEpochDay(LocalDate.java:341)

\n
\n\n

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

\n\n
int year = YEAR.checkValidIntValue(yearEst);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6yearEst其中 -1000018564

\n