Java时间段取交集

在Java编程中,我们经常需要处理时间段的交集问题。例如,我们可能需要判断两个时间段是否有交集,或者需要找出多个时间段的公共部分。在本文中,我们将介绍如何使用Java语言来解决这些问题,并提供相关的代码示例。

判断两个时间段是否有交集

首先,我们来解决判断两个时间段是否有交集的问题。我们假设每个时间段由开始时间和结束时间表示,可以用Java的LocalDateTime类来表示。下面是一个判断两个时间段是否有交集的方法:

public static boolean hasOverlap(LocalDateTime start1, LocalDateTime end1, LocalDateTime start2, LocalDateTime end2) {
    return start1.isBefore(end2) && start2.isBefore(end1);
}

该方法接受四个参数,分别是第一个时间段的开始时间、结束时间,以及第二个时间段的开始时间、结束时间。该方法通过比较时间段的开始和结束时间,如果两个时间段有交集,则返回true,否则返回false

下面是一个使用示例:

LocalDateTime start1 = LocalDateTime.of(2022, 1, 1, 8, 0);
LocalDateTime end1 = LocalDateTime.of(2022, 1, 1, 12, 0);
LocalDateTime start2 = LocalDateTime.of(2022, 1, 1, 10, 0);
LocalDateTime end2 = LocalDateTime.of(2022, 1, 1, 14, 0);
boolean overlap = hasOverlap(start1, end1, start2, end2);
System.out.println("两个时间段是否有交集: " + overlap);

在上面的示例中,我们定义了两个时间段,分别是[8:00, 12:00][10:00, 14:00],然后调用hasOverlap方法来判断它们是否有交集。最终输出的结果是true,表示两个时间段有交集。

找出多个时间段的公共部分

接下来,我们来解决找出多个时间段的公共部分的问题。我们假设有一个时间段列表,其中的每个时间段由开始时间和结束时间表示。下面是一个找出多个时间段的公共部分的方法:

public static List<LocalDateTime> findCommonInterval(List<LocalDateTime[]> intervals) {
    if (intervals == null || intervals.isEmpty()) {
        return Collections.emptyList();
    }
    
    LocalDateTime start = intervals.get(0)[0];
    LocalDateTime end = intervals.get(0)[1];
    
    for (LocalDateTime[] interval : intervals) {
        start = (interval[0].isAfter(start)) ? interval[0] : start;
        end = (interval[1].isBefore(end)) ? interval[1] : end;
    }
    
    if (start.isAfter(end)) {
        return Collections.emptyList();
    } else {
        return Arrays.asList(start, end);
    }
}

该方法接受一个时间段列表作为参数,并返回找到的公共部分时间段。该方法首先判断时间段列表是否为空,如果为空,则返回一个空列表。然后,通过遍历时间段列表,找到最大的开始时间和最小的结束时间,构成公共部分时间段。如果最大的开始时间在最小的结束时间之后,则表示没有公共部分,返回一个空列表。

下面是一个使用示例:

List<LocalDateTime[]> intervals = new ArrayList<>();
intervals.add(new LocalDateTime[]{LocalDateTime.of(2022, 1, 1, 8, 0), LocalDateTime.of(2022, 1, 1, 12, 0)});
intervals.add(new LocalDateTime[]{LocalDateTime.of(2022, 1, 1, 10, 0), LocalDateTime.of(2022, 1, 1, 14, 0)});
intervals.add(new LocalDateTime[]{LocalDateTime.of(2022, 1, 1, 9, 0), LocalDateTime.of(2022, 1, 1, 11, 0)});
List<LocalDateTime> commonInterval = findCommonInterval(intervals);
System.out.println("多个时间段的公共部分: " + commonInterval);

在上面的示例中,我们定义了三个时间段,分别是[8:00, 12:00][10:00, 14:00][9:00, 11:00],然后调用findCommonInterval方法来找到它