Java 获取时间范围差集

主要方法: 

/**
 * 获取时间范围差集
 * 把所有时间按顺序排序,取开始结束时间中间,每一个时间点构成区间,返回不在需要去除的时间区间
 * @param subtractionDateList 需要去除的时间 [[开始时间,结束时间], [开始时间,结束时间]]
 * @param min 时间范围开始时间
 * @param max 时间范围结束时间
 * @return
 */
public static List<Date[]> getDateSubtraction(List<Date[]> subtractionDateList, Date min, Date max) {

    List<Date> dateList = Lists.newArrayList(min, max);
    for (Date[] dates : subtractionDateList) {
        dateList.add(dates[0]);
        dateList.add(dates[1]);
    }
    List<Date> sortDateList = dateList.stream().sorted().collect(Collectors.toList());
    OptionalInt minIndex = IntStream.range(0, sortDateList.size())
            .filter(i -> sortDateList.get(i).compareTo(min) >= 0)
            .findFirst();
    OptionalInt maxIndex = IntStream.range(0, sortDateList.size())
            .filter(i -> sortDateList.get(i).compareTo(max) >= 0)
            .findFirst();

    List<Date[]> result = new ArrayList<>();
    if (!minIndex.isPresent() || !maxIndex.isPresent()) {
        return result;
    }

    List<Range<Date>> collect = subtractionDateList.stream().map(dates -> Range.open(dates[0], dates[1])).collect(Collectors.toList());

    List<Date> subList = sortDateList.subList(minIndex.getAsInt(), maxIndex.getAsInt());
    subList.add(sortDateList.get(maxIndex.getAsInt()));
    t: for (int i = 0; i < subList.size(); i++) {
        if (i == subList.size() - 1 || subList.get(i).compareTo(subList.get(i + 1))== 0) {
            continue;
        }
        for (Range<Date> dateRange : collect) {
            if (dateRange.encloses(Range.open(subList.get(i), subList.get(i + 1)))) {
                continue t;
            }
        }
        result.add(new Date[]{subList.get(i), subList.get(i + 1)});
    }

    return result;
}

测试类:

public class test{
    
    public final static String DATETIME_DEFAULT = "yyyy-MM-dd HH:mm:ss";

    public static void main(String[] a) throws FileNotFoundException, ParseException {


        Date startDate = DateUtils.parseDate("2023-02-08 15:20:00", DATETIME_DEFAULT);
        Date endDate = DateUtils.parseDate("2023-02-08 16:30:00", DATETIME_DEFAULT);

        Date a1 = DateUtils.parseDate("2023-02-08 15:00:00", DATETIME_DEFAULT);
        Date a2 = DateUtils.parseDate("2023-02-08 15:29:00", DATETIME_DEFAULT);

        Date b1 = DateUtils.parseDate("2023-02-08 15:30:00", DATETIME_DEFAULT);
        Date b2 = DateUtils.parseDate("2023-02-08 16:00:00", DATETIME_DEFAULT);

        Date c1 = DateUtils.parseDate("2023-02-08 16:20:00", DATETIME_DEFAULT);
        Date c2 = DateUtils.parseDate("2023-02-08 16:50:00", DATETIME_DEFAULT);

        Date d1 = DateUtils.parseDate("2023-02-08 16:40:00", DATETIME_DEFAULT);
        Date d2 = DateUtils.parseDate("2023-02-08 16:50:00", DATETIME_DEFAULT);

        System.out.println("开始结束时间:" + DateFormatUtils.format(startDate, DATETIME_DEFAULT) + "—" + DateFormatUtils.format(endDate, DATETIME_DEFAULT));

        List<Date[]> list = new ArrayList<>();
        list.add(new Date[]{a1, a2});
        list.add(new Date[]{b1, b2});
        list.add(new Date[]{c1, c2});
        list.add(new Date[]{d1, d2});
        for (Date[] dates : list) {
            System.out.println("去除时间:" + DateFormatUtils.format(dates[0], DATETIME_DEFAULT) + "—" + DateFormatUtils.format(dates[1], DATETIME_DEFAULT));
        }

        List<Date[]> subtraction = getDateSubtraction(list, startDate, endDate);
        for (Date[] aa : subtraction) {
            String s = DateFormatUtils.format(aa[0], DATETIME_DEFAULT);
            String e = DateFormatUtils.format(aa[1], DATETIME_DEFAULT);
            System.out.println("差值:" + s + "——" + e);
        }

    }

}

需要导入以下Maven:

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>

输出结果如下:

开始结束时间:2023-02-08 15:20:00—2023-02-08 16:30:00
去除时间:2023-02-08 15:00:00—2023-02-08 15:29:00
去除时间:2023-02-08 15:30:00—2023-02-08 16:00:00
去除时间:2023-02-08 16:20:00—2023-02-08 16:50:00
去除时间:2023-02-08 16:40:00—2023-02-08 16:50:00
差值:2023-02-08 15:29:00——2023-02-08 15:30:00
差值:2023-02-08 16:00:00——2023-02-08 16:20:00

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值