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

时间:2017-05-06 11:53:05

标签: java java-8 epoch localdate

当我尝试将epochTime转换为LocalDate时,我收到此异常,其中:

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

2)对应的纪元:1493959132000

LocalDate lastUpdatedDate = LocalDate.ofEpochDay(1493959132000);

例外:

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)

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

给出了此异常的事先警告

这实际上是什么意思,什么时候到来?

2 个答案:

答案 0 :(得分:4)

<{> Here's ofEpochDay的javadoc,这就是它所说的:

  

这将返回具有指定纪元日的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);

Here's javadoc for Instant class。

<强>更新

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

LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24));
System.out.println(localDate);

答案 1 :(得分:0)

如果您考虑一下,将转换为本地日期并不合理。在特定时刻,您仍需要一个位置/时区来确定您所在的日期分界线的哪一侧。

你提到的时代是星期五,2017年5月5日04:38:52 UTC。如果你在Greenwhich,LocalDate将是5月5日,但如果你在美国西海岸,它仍然是5月4日。这是list converting that epoch to different time zones

Instant.ofEpochMilli(1493959132000L).atZone(ZoneOffset.UTC).toLocalDate() //2017-05-05
Instant.ofEpochMilli(1493959132000L).atZone(ZoneId.of("America/Chicago")).toLocalDate() //2017-05-04

因此,论证要求将纪元天数转换为本地日期。

LocalDate.ofEpochDay(17291) //2017-05-05