java.time.DateTimeException:年份值无效(有效值 -999999999 - 999999999)
java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999)
当我尝试将 epochTime 转换为 LocalDate 时出现此异常,其中:
1) 日期:2017-05-05 10:08:52.0
2)对应的epoch: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-
给出了此异常的预先警告
这到底是什么意思,什么时候来?
Here's ofEpochDay
的 javadoc,是这样写的:
This returns a LocalDate with the specified epoch-day. The EPOCH_DAY
is a simple incrementing count of days where day 0 is 1970-01-01.
Negative numbers represent earlier days.
因此,它期望参数是自 1970-01-01
以来的天数。由于您传递的值无效,它会抛出 Exception
.
现在,来到您的用例,如果您想将纪元时间转换为本地日期,那么您需要使用 Instant
class 的 ofEpochMilli
方法,例如:
LocalDate localDate =
Instant.ofEpochMilli(1493959132000l).atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate);
Here's Instant
class.
的 javadoc
更新
或者,您可以将时间戳转换为自 1970-01-01 以来的天数,并将其传递给 ofEpochDay()
方法,例如:
LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24));
System.out.println(localDate);
如果您考虑一下,将纪元 秒 转换为本地日期是没有意义的。在特定时刻,您仍然需要一个 location/time 区域来确定您在日期分界线的哪一侧。
您提到的纪元是 2017 年 5 月 5 日星期五 04:38:52 UTC。如果你在格林,本地日期是 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
您正在使用 timeInMillis 作为值而不是天数。您可以使用持续时间 class 来计算天数。
Duration duration = Duration.ofMillis(1493959132000);
long days = duration.toDays();
LocalDate lastUpdatedDate = LocalDate.ofEpochDay(days);
当我尝试将 epochTime 转换为 LocalDate 时出现此异常,其中:
1) 日期:2017-05-05 10:08:52.0
2)对应的epoch: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-
给出了此异常的预先警告这到底是什么意思,什么时候来?
Here's ofEpochDay
的 javadoc,是这样写的:
This returns a LocalDate with the specified epoch-day. The EPOCH_DAY is a simple incrementing count of days where day 0 is 1970-01-01. Negative numbers represent earlier days.
因此,它期望参数是自 1970-01-01
以来的天数。由于您传递的值无效,它会抛出 Exception
.
现在,来到您的用例,如果您想将纪元时间转换为本地日期,那么您需要使用 Instant
class 的 ofEpochMilli
方法,例如:
LocalDate localDate =
Instant.ofEpochMilli(1493959132000l).atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate);
Here's Instant
class.
更新
或者,您可以将时间戳转换为自 1970-01-01 以来的天数,并将其传递给 ofEpochDay()
方法,例如:
LocalDate localDate = LocalDate.ofEpochDay(1493959132000l/(1000 * 60 *60 * 24));
System.out.println(localDate);
如果您考虑一下,将纪元 秒 转换为本地日期是没有意义的。在特定时刻,您仍然需要一个 location/time 区域来确定您在日期分界线的哪一侧。
您提到的纪元是 2017 年 5 月 5 日星期五 04:38:52 UTC。如果你在格林,本地日期是 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
您正在使用 timeInMillis 作为值而不是天数。您可以使用持续时间 class 来计算天数。
Duration duration = Duration.ofMillis(1493959132000);
long days = duration.toDays();
LocalDate lastUpdatedDate = LocalDate.ofEpochDay(days);