-1

当我尝试将 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-给出了此异常的事先警告

这实际上意味着什么,什么时候到来?

4

2 回答 2

7

这是javadoc 的ofEpochDay,它是这么说的:

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

因此,它希望参数是自 以来的天数1970-01-01。由于您传递的值无效,它会抛出Exception.

现在,来到你的用例,如果你想将纪元时间转换为本地日期,那么你需要使用类ofEpochMilli的方法Instant,例如:

LocalDate localDate =
        Instant.ofEpochMilli(1493959132000l).atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate);

这是类的javadoc Instant

更新

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

LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24));
System.out.println(localDate);
于 2017-05-06T12:03:33.477 回答
1

如果您考虑一下,将纪元秒数转换为本地日期是没有意义的。在特定时刻,您仍然需要一个位置/时区来确定您在日期分界线的哪一侧。

The epoch you mention is Fri, 05 May 2017 04:38:52 UTC. If you're in Greenwhich the LocalDate would be May 5th but if you're on the US West Coast it's still May 4th. Here's a 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

Therefore the argument asks for the amount of epoch days to convert to a local date.

LocalDate.ofEpochDay(17291) //2017-05-05
于 2017-05-06T12:21:07.070 回答