Java实现判断两个时间段是否重叠的方法

版权申诉
5星 · 超过95%的资源 0 下载量 116 浏览量 更新于2024-07-06 收藏 17KB DOCX 举报
"Java 判断两个时间段是否重叠的案例" 在 Java 开发中,有时候我们需要判断两个时间段是否有所重叠,例如在日程管理、会议安排等场景。本案例提供了一个实现此功能的方法,通过定义一个 `TimeSlot` 类来表示时间段,并实现了相应的比较逻辑。以下是详细的解释和代码分析: 首先,我们定义一个 `TimeSlot` 类,它包含两个属性:起始时间和终止时间。为了确保时间段的有效性,构造方法会检查起始时间是否在终止时间之前。此外,为了方便比较,我们还需要为 `TimeSlot` 类提供四个比较方法:小于、大于、小于等于和大于等于。 ```java @Data @Component public class TimeSlot { private LocalDateTime startTime; private LocalDateTime endTime; public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) { if (startTime.isAfter(endTime)) { throw new IllegalArgumentException("Start time must be before end time."); } this.startTime = startTime; this.endTime = endTime; } // 定义比较方法 public boolean isBefore(TimeSlot other) { return this.endTime.isBefore(other.startTime); } public boolean isAfter(TimeSlot other) { return this.startTime.isAfter(other.endTime); } public boolean isLessThanOrEqualTo(TimeSlot other) { return !isAfter(other); } public boolean isGreaterThanOrEqualTo(TimeSlot other) { return !isBefore(other); } } ``` 接下来,我们需要实现一个静态方法 `overlapped`,用于判断两个时间段是否有重叠。该方法首先根据起始时间的先后顺序确定 `previous` 和 `next`,然后进行重叠判断。由于业务需求,允许时间点的重叠,所以这里使用的是小于等于和大于等于的比较,如果不需要时间点重叠的情况,只需将 `le` 改为 `lt`,`ge` 改为 `gt` 即可。 ```java public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) { TimeSlot previous, next; previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2; next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1; // 允许时间点重叠 return !((previous.isLessThanOrEqualTo(next)) || (next.isGreaterThanOrEqualTo(previous))); } ``` 这个案例的关键在于理解时间的比较逻辑。如果一个时间段的结束时间在另一个时间段的开始时间之前,或者一个时间段的开始时间在另一个时间段的结束时间之后,那么这两个时间段就没有重叠。反之,如果有任何重叠(包括时间点重叠),则认为这两个时间段是重叠的。 使用这个 `overlapped` 方法,你可以轻松地在 Java 应用中判断两个时间段是否重叠,从而进行相关的业务处理。记得在实际项目中,根据具体需求调整时间比较的逻辑,以满足不同的业务场景。