Java 1.8时间function

所以Java 1.8附带了一大堆新的(和旧的)类来管理时间计算: java.time.Instantjava.time.LocalTimejava.time.temporal.ChronoUnit ,以及更多……

但为什么没有简单的方法来计算其中任何一个之间的时差? 我希望“time_later – time_earlier”是最常用的时间操纵,但这是无处可见的。 我无法从另一个中减去一个LocalTime并获得一个新的LocalTime; 我不能从另一个中减去一个瞬间来获得一个新的瞬发。 相反,我必须摆弄ChronoUnits.between,以及长毫秒和其他什么来实现这个非常有用的东西。

为什么是这样? 必须要发生一些我没有得到的事情? 或者我只是愚蠢……?

在Java 8之前,你问题的常见答案是“使用Joda Time”

但是Joda Time(Stephen Colebourne)的作者深深卷入了新的Java 8时间类和方法。 这是两篇非常好的文章:

对于您的特定问题,您可能需要考虑Java 8“持续时间”和“LocalTime”,“LocalDate”和/或“LocalTimeDate”(以及其他选项):

 // A duration of 3 seconds and 5 nanoseconds Duration duration = Duration.ofSeconds(3, 5); Duration oneDay = Duration.between(today, yesterday); // Tomorrow LocalDate tomorrow = LocalDate.now().plusDays(1); // Yesterday LocalDate yesterday = LocalDate.now().plusDays(-1); // before 5 houres and 30 minutes LocalDateTime dateTime = LocalDateTime.now().minusHours(5).minusMinutes(30); 

引文:

“我不能从另一个中减去一个LocalTime并得到一个新的LocalTime”

这是一个根本错误的想法的主要原因是物理和数学。 LocalTimeInstant等对象表示时间轴上的时间点。 但两个时间点之间的差异只能是持续时间,即时间长度。 在数学上,您将结果存在于另一个维度(点对线)。 因此,减少两个时间点不能产生另一个时间点。

但是按单位测量两个时间点之间的距离是有意义的,正如您所看到的,JSR-310(也就是java.time-package)支持此操作。 顺便说一句,持续时间/周期计算在某种程度上是有限的(即没有像Joda-Time那样的混合年,日,小时之间的操作),但一般来说,类ChronoUnit之间的方法并不是复杂的“小提琴”周围”。 它简单易懂。

提供了用于计算两个时间点之间的差异的方法。

 Instant a = Instant.now().minusSeconds(2); Instant b = Instant.now().plusSeconds(2); Duration difference = Duration.between(a, b); long secsBetween1 = a.until(b, ChronoUnit.SECONDS); long secsBetween2 = ChronoUnit.SECONDS.between(a, b); 

Duration是表示Duration量的主要对象,而Duration.between是创建它的关键方法。

ChronoUnit.betweenTemporal.until是略低级别的方法,它们将差异作为特定单位的long ChronoUnit.between返回。

您可以使用java.time.Instant.toEpochMilli()获得所需的function。 这将使您获得与旧java.util.Date.getTime()相同的function。

只要您不必处理时区, Instant就是您所需要的全部内容。 不要被所有其他东西弄糊涂。

如果你必须处理时区,那么很多复杂性变得必要,尽管由于过度一般性而在包中存在一些额外的复杂性。