判断俩个区间定时器是否重叠

代码备份

定时器分开始时间和结束时间,而且可以设置按周一到周日的循环,怎么判断俩个时间段有重复

    public void overlapTest() {
        ArrayList<String> timer = new ArrayList<>();
        // 下面时间段进行俩俩比较,测试是否有重叠
        // true
        timer.add("00 00 13-15 ? * 1,2,3,4,5,6,7");
        timer.add("00 00 14-16 ? * 1,7");

        // false
        timer.add("00 00 13-15 ? * 1,3,5");
        timer.add("00 00 14-16 ? * 2,4,6");

        // true
        timer.add("00 00 18-8 ? * 1,2,3");
        timer.add("00 00 7-9 ? * 4,5,6");

        // false
        timer.add("00 00 13-14 ? * 1,2,3");
        timer.add("00 00 13-14 ? * 4,5,6,7");

        // true
        timer.add("00 00 18-8 ? * 1");
        timer.add("00 00 7-9 ? * 2");

        // true
        timer.add("00 00 13-14 ? * 2");
        timer.add("00 00 13-14 ? * 1,2,3");


        for (int i = 0; i+1 < timer.size(); i+=2) {
            String[] cronData1 = timer.get(i).split(" ");
            String[] cronData2 = timer.get(i+1).split(" ");

            String week1[];
            Calendar startTime1 = Calendar.getInstance();
            Calendar endTime1 = Calendar.getInstance();
            String week2[];
            Calendar startTime2 = Calendar.getInstance();
            Calendar endTime2 = Calendar.getInstance();

            week1 = cronData1[5].split(",");
            startTime1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(cronData1[2].split("-")[0]));
            endTime1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(cronData1[2].split("-")[1]));
            startTime1.set(Calendar.MINUTE, 0);
            startTime1.set(Calendar.SECOND, 0);
            endTime1.set(Calendar.MINUTE, 0);
            endTime1.set(Calendar.SECOND, 0);

            week2 = cronData2[5].split(",");
            startTime2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(cronData2[2].split("-")[0]));
            endTime2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(cronData2[2].split("-")[1]));
            startTime2.set(Calendar.MINUTE, 0);
            startTime2.set(Calendar.SECOND, 0);
            endTime2.set(Calendar.MINUTE, 0);
            endTime2.set(Calendar.SECOND, 0);

            boolean ret1, ret2;
            ret1= isOverlap(week1, startTime1, endTime1, week2, startTime2, endTime2);
            ret2= isOverlap(week2, startTime2, endTime2, week1, startTime1, endTime1);
            Log.i("test", timer.get(i) + " VS " +timer.get(i+1) + " = " + ret1 + " " + ret2 );

        }
    }

    /**
     * 比较startTime1~endTime1  和 startTime2~endTime2俩个时间段是否重复
     * @param week1 是第一个定时器的周循环模式,1=周日,2=周一
     * @param startTime1 只使用里面的时分秒信息
     * @param endTime1 只使用里面的时分秒信息
     * @param week2
     * @param startTime2
     * @param endTime2
     * @return
     */
    public static boolean isOverlap(String week1[], Calendar startTime1, Calendar endTime1, String week2[], Calendar startTime2, Calendar endTime2) {
        /**
         * week1 是第一个定时器的周循环模式,1=周日,2=周一
         * startTime, endTime,只使用里面的时分秒信息
         */

        for(String w1 : week1) {
            for(String w2 : week2) {
                Calendar start1 = Calendar.getInstance();
                Calendar start2 = Calendar.getInstance();
                Calendar end1 = Calendar.getInstance();
                Calendar end2 = Calendar.getInstance();

                start1.set(Calendar.DAY_OF_WEEK, Integer.parseInt(w1));
                end1.set(Calendar.DAY_OF_WEEK, Integer.parseInt(w1));
                start2.set(Calendar.DAY_OF_WEEK, Integer.parseInt(w2));
                end2.set(Calendar.DAY_OF_WEEK, Integer.parseInt(w2));

                setTime(start1, startTime1);
                setTime(end1, endTime1);
                setTime(start2, startTime2);
                setTime(end2, endTime2);

                if(start1.after(end1)) { // 跨天的情况
                    end1.add(Calendar.DAY_OF_YEAR, 1);
                }

                if(start2.after(end2)) { // 跨天的情况
                    end2.add(Calendar.DAY_OF_YEAR, 1);
                }

                if((!start1.after(start2) && end1.after(start2)) || (!start1.before(start2) && end2.after(start1))) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 拷贝date的时分秒数据到calender变量
     * @param calendar
     * @param date
     */
    public static void setTime(Calendar calendar, Calendar date) {
        calendar.set(Calendar.HOUR_OF_DAY, date.get(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE, date.get(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, date.get(Calendar.SECOND));
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值