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
通じ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());
缶誰かの助け私は、してください?
少なくともジャワ10により固定少なくともジャワ8更新181のバグ、と思われます。
Javaの10 - パス
私の作品、Javaの10.0.2、ズールーJVMによってアズールシステム上、MacOSのハイシエラ。
LocalDate ld =
LocalDate.ofEpochDay(
ChronoField.EPOCH_DAY.range().getMinimum()
)
;
System.out.println( ld );
-999999999-01-01
Javaの8 - 失敗
Javaの1.8.0_181に例外をスローし、ズールーJVMによってアズールシステム上、MacOSのハイシエラ。
スレッド "メイン" java.time.DateTimeExceptionの例外:年の値が無効です(有効な値-999999999 - 999999999):java.time.temporalでjava.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)で-1000018564 java.time.LocalDate.ofEpochDayで.ChronoField.checkValidIntValue(ChronoField.java:722)(LocalDate.java:341)
怒ら行がで#341のようですLocalDate.java
ファイル。
int year = YEAR.checkValidIntValue(yearEst);
...どこyearEst
で-1000018564