2017-05-06 838 views
-3

我收到的时候我试图epochTime转换为这个LOCALDATE例外其中:java.time.DateTimeException:对于年(有效值-999999999 - 999999999)值无效

1)日期:2017年5月5日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-

给出了此例外的事先警告,这实际上意味着什么?它是什么时候发生的?

的Javadoc ofEpochDay
+5

那么,1493959132000天,大约是1493959132000/365 = 4093000000年,如异常消息中所述。你的假设是错误的。 4,000,000,000 + epochYear> 2017年。时代年是1970年,因此(2017-1970)* 365几乎等于17500天... –

+2

再一次,阅读你所调用的方法的javadoc将会有很大的帮助。 https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#ofEpochDay-long- –

回答

4

Here's,这就是它说:

此方法返回指定的划时代的一天LOCALDATE的。 EPOCH_DAY 是第0天为1970-01-01的简单递增计数天数。 负数表示较早的日子。

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

现在,来到你的使用情况,如果要出现时间转换为随后LOCALDATE你需要使用InstantofEpochMilli方法,例如:

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

Here's的javadoc Instant类。

更新

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

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

如果你想想看,将当前日期转换为当地日期没有意义。在特定时刻,您仍然需要一个位置/时区来确定您所在的日期分界线的哪一侧。

你提到的时代是星期五,05 May 2017 04:38:52 UTC。如果你是绿色的,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