java.time.DateTimeException:年份的无效值(有效值-999999999-999999999)

The*_*nce -3 java epoch java-8 localdate

当我尝试将epochTime转换为LocalDate时,出现此异常:

1)日期:2017-05-05 10:08:52.0

2)对应纪元:1493959132000

LocalDate lastUpdatedDate = LocalDate.ofEpochDay(1493959132000);
Run Code Online (Sandbox Code Playgroud)

例外情况:

java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): 4090323145
    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)
Run Code Online (Sandbox Code Playgroud)

我了解到,java.time.LocalDate的源代码在https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#ofEpochDay-long-

这实际上意味着什么,什么时候出现?

Dar*_*hta 5

这是的 javadoc ofEpochDay,它表示的是:

这将返回具有指定的纪元日的LocalDate。EPOCH_DAY是一个简单的天增量计数,其中第0天是1970-01-01。负数表示较早的日子。

因此,它期望参数为自以来的天数1970-01-01。由于您传递的值无效,因此会引发Exception

现在,进入您的用例,如果您想将纪元时间转换为localdate,则需要使用类的ofEpochMilli方法Instant,例如:

LocalDate localDate =
        Instant.ofEpochMilli(1493959132000l).atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate);
Run Code Online (Sandbox Code Playgroud)

这是Instant javadoc 。

更新资料

或者,您可以将时间戳转换为自1970-01-01以来的天数,并将其传递给ofEpochDay()方法,例如:

LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24));
System.out.println(localDate);
Run Code Online (Sandbox Code Playgroud)