JavaのLOCALDATEはすべてEpochDayフィールド有効な値を受け入れません

アーサー・エンリケフラガの:
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)方法。そして、このような場合のためにLocalDateEpochDayフィールドのデフォルトの範囲は変更されません。

@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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=192855&siteId=1