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
,否则为什么在范围内多长时间?
在Instant
和INSTANT_SECONDS
字段中也会发生同样的情况:Instant.ofEpochSecond(ChronoField.INSTANT_SECONDS.rangeRefinedBy(Instant.now()).getMinimum());
有人可以帮我吗?
答案 0 :(得分:2)
似乎至少是Java 8 Update 181中的错误,至少是由Java 10修复的。
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 1.8.0_181上,在Zulu JVM上由Azul Systems的macOS 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