【问题标题】:Java LocalDate doesn't accept all EpochDay field valid valuesJava LocalDate 不接受所有 EpochDay 字段有效值
【发布时间】:2018-09-19 16:04:22
【问题描述】:
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,不然为什么长在范围内?

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

有人可以帮帮我吗?

【问题讨论】:

  • 这在 Java 10 中有效,但在 Java 8 中失败...

标签: java date datetime java-8


【解决方案1】:

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

Java 10 - 通过

为我工作,Java 10.0.2,Zulu JVMAzul 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 by Azul Systems、macOS High Sierra 上引发异常。

线程“主”java.time.DateTimeException 中的异常:年份值无效(有效值 -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

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多