Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找出由两个长历元值表示的两个日期之间的差异_Java_Java 8_Epoch_Java Time_Localdate - Fatal编程技术网

Java 找出由两个长历元值表示的两个日期之间的差异

Java 找出由两个长历元值表示的两个日期之间的差异,java,java-8,epoch,java-time,localdate,Java,Java 8,Epoch,Java Time,Localdate,我需要的是我有一个Long值,它表示自epoch以来的毫秒值。我想知道当天和当天的天数有什么不同。 我使用的是Java8的DAYS.between(inputDate,currentDate) 对于currentDate,我使用了LocalDateTime currentDate=LocalDateTime.now() 但我面临的问题是,当我将long值转换为java8localdatetime时。当我使用 LocalDate date = Instant.ofEpochMilli(149037

我需要的是我有一个Long值,它表示自epoch以来的毫秒值。我想知道当天和当天的天数有什么不同。 我使用的是Java8的
DAYS.between(inputDate,currentDate)

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

LocalDate date = Instant.ofEpochMilli(1490372528)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();
结果是
1970-01-18
,当我在中输入相同的值时,它给出
Fri,2017年3月24日16:22:08 GMT


为什么会有这种差异?如何有效地从一个长值中获取java8日期以天为单位使用。between()?

您必须做出决定。或者,您的数字是“自历元以来的毫秒值”,如您在问题中所述,或者是“自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
。它只会委托给
,直到上面使用的
方法。相当于Java 8之前的代码会稍微复杂一些

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

你必须做出决定。或者,您的数字是“自历元以来的毫秒值”,如您在问题中所述,或者是“自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
。它只会委托给
,直到上面使用的
方法。相当于Java 8之前的代码会稍微复杂一些

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

从您链接到的页面:Unix历元(或Unix时间或POSIX时间或Unix时间戳)是自1970年1月1日以来经过的秒数。顾名思义,ofEpochMilli需要毫秒。从链接到的页面使用:Unix历元(或Unix时间或POSIX时间或Unix时间戳)是自1970年1月1日以来经过的秒数。顾名思义,ofEpochMilli需要毫秒。用伟大的答案。还有,你觉得这个答案怎么样@gaurav很好,它完成了这项工作,但我会尽量避免这种手动计算,因为有像
TimeUnit
Duration
这样的类已经完成了这项工作,即对于两个
Date
实例,您可以只使用
System.out.println(Duration.between(d2.toInstant(),d1.toInstant())。避免这种计算是有意义的。由于我使用的是Java1.7,所以我将使用TimeUnit类的方法。回答得很好。还有,你觉得这个答案怎么样@gaurav很好,它完成了这项工作,但我会尽量避免这种手动计算,因为有像
TimeUnit
Duration
这样的类已经完成了这项工作,即对于两个
Date
实例,您可以只使用
System.out.println(Duration.between(d2.toInstant(),d1.toInstant())。避免这种计算是有意义的。作为,我使用Java1.7,我将使用TimeUnit类的方法。