3

所以 Java 1.8 带有一组全新的(和旧的)类来管理时间计算:java.time.Instantjava.time.LocalTimejava.time.temporal.ChronoUnit,也许还有更多......

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

为什么是这样?一定有一些我没有得到的事情发生吗?还是我只是傻...?

4

4 回答 4

4

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

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

对于您的具体问题,您可能需要考虑 Java 8“Duration”和“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);
于 2014-06-29T07:29:44.020 回答
3

引文:

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

这是一个根本错误的想法的主要原因是物理和数学问题。LocalTime诸如或之类的对象Instant代表时间轴上的一个时间点。但是两个时间点之间的差异只能是一个持续时间,也就是一个时间长度。从数学上讲,您会在另一个维度(点与线)中得到结果。所以两个时间点相减不能产生另一个时间点。

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

于 2014-06-29T07:23:48.953 回答
1

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

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.between是创建时间的关键方法。

ChronoUnit.between并且Temporal.until是稍微低级的方法,它们将差异作为long特定单位返回。

于 2014-10-19T21:20:01.543 回答
0

您可以使用java.time.Instant.toEpochMilli(). 这为您提供与旧的相同的功能java.util.Date.getTime()

只要您不必处理时区,Instant这几乎就是您所需要的。不要被所有其他的东西弄糊涂了。

如果您确实必须处理时区,则需要很多复杂性,尽管由于过于笼统,包中存在一些额外的复杂性。

于 2014-06-28T22:08:31.100 回答