计算一个区间时间差值,时间保留剩下的差值

这篇具有很好参考价值的文章主要介绍了计算一个区间时间差值,时间保留剩下的差值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解决目的  begin end,去除集合类的其他区间差值

List<rang> r1 = new ArrayList(); 得到差值


package com.jowoiot.wmzs.utils.date;

import com.google.common.collect.Lists;
import com.google.common.collect.Range;
import org.apache.commons.lang.time.DateFormatUtils;

import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @BelongsProject: wmzs
 * @BelongsPackage: com.jowoiot.wmzs.utils.date
 * @Author: lius
 * @CreateTime: 2023-08-30  17:36
 * @Description: 计算一个区间时间,去除其他区间时间保留剩下的差值
 * @Version: 1.0
 */


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

    /**
     * 获取时间范围差集
     * 把所有时间按顺序排序,取开始结束时间中间,每一个时间点构成区间,返回不在需要去除的时间区间
     *
     * @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 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);
        }

    }


}

文章来源地址https://www.toymoban.com/news/detail-685658.html

到了这里,关于计算一个区间时间差值,时间保留剩下的差值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包