Java 8 java.time 的时间计算。*

Temporal calculations with Java 8 java.time.*

让我们有 java.time.Instant - 某个事件的起点,以及 java.time.Duration - 此事件的持续时间。

我可以用java.time.Period来计算另一个Instant是否属于这个时期吗?如果不是 - 我应该使用哪种方法来定义它?

给定瞬间 instant 和持续时间 duration,您想检查瞬间 toCheck 是否属于区间 [instant; instant + duration]

为此,您可以使用 Duration.between 计算 instanttoCheck 之间的持续时间。如果此持续时间为正且小于指定的持续时间,则要检查的时刻在想要的时间间隔内。

public static void main(String[] args) {
    Instant instant = Instant.now();
    Duration duration = Duration.ofSeconds(10);
    Instant toCheck = instant.plusSeconds(5);

    Duration d = Duration.between(instant, toCheck);
    if (!d.isNegative() && d.compareTo(duration) <= 0) {
        System.out.println("is in interval!");
    }
}

另一种基于开始和结束的解决方案Instant更直观的比较:

    Instant start     = Instant.now(); // your value
    Duration duration = Duration.ofSeconds(10);  // your value
    Instant end       = start.plus(duration);

    Instant toCheck   = start.plusSeconds(5); // your value
    if (!toCheck.isBefore(start) && !toCheck.isAfter(end)) 
        System.out.println("is in interval!");

根据 OP 的要求,使用 Period 的更扭曲的示例。如果您想在 Instants 之间使用 DaysWeeksMonths 等并希望确保夏令时、闰年等得到无缝处理,这会更有用。

Instant start = Instant.now();
ZonedDateTime eventStart = ZonedDateTime.ofInstant(start, ZoneId.systemDefault());
ZonedDateTime eventEnd = eventStart.plus(Period.ofDays(5));
Instant end = eventEnd.toInstant();

Instant toCheck = start.plus(2, ChronoUnit.DAYS);

if (!toCheck.isBefore(start) && !toCheck.isAfter(end))
{
  System.out.println("Instant to check is between start and end");
}

ThreeTen-Extra project includes java.time features that didn't make the cut for the JDK. One of these is Interval, see the Javadoc.

使用Interval,这道题可以写成:

Interval iv = Interval.of(start, duration);
boolean contains = iv.contains(instantToCheck);