gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:00 25 4
gpt4 key购买 nike

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-time 策略是通过 range (TemporalField) 方法查询自己的 Temporal 的 ValueRange 以获得 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,否则为什么 long 在范围内?

InstantINSTANT_SECONDS 字段也是如此:Instant.ofEpochSecond(ChronoField.INSTANT_SECONDS.rangeRefinedBy(Instant.now()).getMinimum()) ;

有人可以帮帮我吗?

最佳答案

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

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 8 - 失败

在 Java 1.8.0_181 上抛出异常,Zulu JVM通过 Azul Systems , 关于 macOS High Sierra .

Exception in thread "main" 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)

违规行似乎是 LocalDate.java 文件中的 #341。

int year = YEAR.checkValidIntValue(yearEst);

…其中 yearEst 是 -1000018564

关于Java LocalDate 不接受所有 EpochDay 字段有效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52410039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com