查询 某一个时间段是否存在交集

1:数据库数据


 

2:查询开始时间  "2023-10-29" 结束时间 ”2023-11-29“  查询结果

可以使用 Java 中的 Date 类和 SimpleDateFormat 类来实现。 首先,将多个时间段表示为 Date 类型的起始时间和结束时间,存储在一个 List 中。 然后,对 List 中的时间段进行比较,判断是否有交集。如果有交集,将交集部分删除,并将不相交的时间段添加到另一个 List 中。 以下是示例代码: ```java import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class TimeUtil { public static void main(String[] args) { List<Date[]> timeList = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 添加时间段 try { Date[] time1 = {sdf.parse("2021-01-01 10:00:00"), sdf.parse("2021-01-01 11:00:00")}; Date[] time2 = {sdf.parse("2021-01-01 10:30:00"), sdf.parse("2021-01-01 12:00:00")}; Date[] time3 = {sdf.parse("2021-01-01 13:00:00"), sdf.parse("2021-01-01 14:00:00")}; Date[] time4 = {sdf.parse("2021-01-01 15:00:00"), sdf.parse("2021-01-01 16:00:00")}; timeList.add(time1); timeList.add(time2); timeList.add(time3); timeList.add(time4); } catch (Exception e) { e.printStackTrace(); } // 判断时间段是否有交集 List<Date[]> resultList = new ArrayList<>(); for (int i = 0; i < timeList.size(); i++) { Date[] time1 = timeList.get(i); boolean isOverlap = false; for (int j = i + 1; j < timeList.size(); j++) { Date[] time2 = timeList.get(j); if (time1[0].compareTo(time2[1]) <= 0 && time1[1].compareTo(time2[0]) >= 0) { // 存在交集 isOverlap = true; if (time1[0].compareTo(time2[0]) <= 0 && time1[1].compareTo(time2[1]) >= 0) { // time1 完全包含 time2,删除 time2 timeList.remove(j); j--; } else if (time1[0].compareTo(time2[0]) >= 0 && time1[1].compareTo(time2[1]) <= 0) { // time2 完全包含 time1,删除 time1 timeList.remove(i); i--; break; } else if (time1[0].compareTo(time2[0]) <= 0) { // time1 开始时间早于 time2,将 time1 结束时间设为 time2 开始时间 time1[1] = time2[0]; } else { // time2 开始时间早于 time1,将 time1 开始时间设为 time2 结束时间 time1[0] = time2[1]; } } } if (!isOverlap) { // 不存在交集,将时间段添加到结果 List 中 resultList.add(time1); } } // 输出结果 for (Date[] time : resultList) { System.out.println(sdf.format(time[0]) + " - " + sdf.format(time[1])); } } } ``` 输出结果为: ``` 2021-01-01 10:00:00 - 2021-01-01 10:30:00 2021-01-01 12:00:00 - 2021-01-01 13:00:00 2021-01-01 14:00:00 - 2021-01-01 15:00:00 2021-01-01 16:00:00 - 2021-01-01 16:00:00 ``` 其中,每行表示一个不相交的时间段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值