1

我的需要是我有一个 Long 值,它代表自纪元以来的毫秒值。我想找出当天和当天之间的天数差异。我正在使用 Java8DAYS.between(inputDate, currentDate)

对于我使用的 currentDateLocalDateTime currentDate = LocalDateTime.now(); 但我面临的问题是当我将 long 值转换为 java8 LocalDateTime 时。当我使用

LocalDate date = Instant.ofEpochMilli(1490372528)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

结果是1970-01-18当我在https://www.epochconverter.com/中输入相同的值时,它给出Fri, 24 Mar 2017 16:22:08 GMT

为什么会有这种差异?如何有效地从长值中获取 java8 日期以在 DAYS.between() 中使用?

4

1 回答 1

7

你必须做出决定。如您在问题中所述,您的数字是“自纪元以来的毫秒值”,或者是“自 1970 年 1 月 1 日以来经过的秒数”,如链接网站上所述(和使用)。

如果它真的是“自纪元以来的毫秒数”,您可以使用

System.out.println(Instant.ofEpochMilli(1490372528).until(Instant.now(), ChronoUnit.DAYS));

打印天数,顺便说一下,这并不比 Java 8 之前的代码简单

System.out.println(TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis()-1490372528));

如果您的数字实际上是“自纪元以来的秒数”,那么您的代码几乎不需要更改

System.out.println(Instant.ofEpochSecond(1490372528).until(Instant.now(),ChronoUnit.DAYS));

这相当于

System.out.println(ChronoUnit.DAYS.between(Instant.ofEpochSecond(1490372528),Instant.now()));

DAYS.between正如你明确提到的。它只会委托给until上面使用的方法。等效的 pre-Java 8 代码会稍微复杂一些

System.out.println(TimeUnit.MILLISECONDS.toDays(
                       System.currentTimeMillis()-TimeUnit.SECONDS.toMillis(1490372528)));
于 2017-05-05T09:21:15.020 回答