【问题标题】:java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999)java.time.DateTimeException:Year 的值无效(有效值 -999999999 - 999999999)
【发布时间】:2023-04-05 13:14:01
【问题描述】:

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

这实际上是什么意思,什么时候出现?

【问题讨论】:

  • 嗯,1493959132000 天,大约是 1493959132000/365=4,093,000,000 年,如异常消息中所述。你的假设是错误的。 4,000,000,000+epochYear > 2017。纪元年是1970,所以(2017-1970)*365几乎等于17500天...
  • 再一次,阅读您正在调用的方法的 javadoc 会有很大帮助。 docs.oracle.com/javase/8/docs/api/java/time/…

标签: java java-8 epoch localdate


【解决方案1】:

Here'sofEpochDay 的 javadoc,它是这么写的:

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

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

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

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

Here'sInstant 类的 javadoc。

更新

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

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

【讨论】:

    【解决方案2】:

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

    您提到的时代是 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
    

    因此,该参数要求将历元 days 的数量转换为本地日期。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多