当我尝试将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-
给出了此异常的事先警告这实际上是什么意思,什么时候到来?
答案 0 :(得分:4)
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