zoukankan      html  css  js  c++  java
  • 根据多个成对的cron表达式生成的时间段,合并

    场景:数据库一张表,有个startcron 和endcron 两个字段,根据表达式计算今天的所有时间段。

    例:startcron :0 30 20 ? * * endcron :0 30 21 ? * *,现在时间20:19 所以得到的时间是20:30~21:30

    由于有多个数据,

     0 0 9 ? * *       0 0 10 ? * * 
     0 30 20 ? * *   0 30 20 ? * * 
     0 0 21 ? * *     0 0 22 ? * * 
     0 30 20 ? * *   0 30 22 ? * * 等

    Map<Date,Date> map = new HashMap<>();

    Set<Date> set = map.keySet();
    Date[] dateArray = new Date[set.size()];
    set.toArray(dateArray);
    if(set.size()==0){
    map.put(starttime, endtime);
    }else{
    boolean flag = true;
    for(int j =0;j<dateArray.length;j++){
    if(flag){
    Date date= dateArray[j];

    if(!(map.get(date).beforestarttime) || date.after(endtime))){
    Date minDate = date.before(starttime)?date:starttime;
    Date maxDate = map.get(date).after(endtime)?map.get(date):endtime;
    map.remove(date);
    map.put(minDate, maxDate);
    flag = false;
    }
    }
    }
    if(flag){
    map.put(starttime, endtime);
    }
    }

    主要思路: 两个时段 A-B          C-D

    map,key放startime  value放endtime

    判断只要相交,if(!(map.get(date).before(starttime) || date.after(endtime)))

    就取四个时间的最大值和最小值,Date minDate = date.before(starttime)?date:starttime;
                   Date maxDate = map.get(date).after(endtime)?map.get(date):endtime;

    先移除map中原来的,map.remove(date);

    再放入最大值和最小值 map.put(minDate, maxDate);

    设置了一个flag,初始值为true,只要有交换就改变flag,,遍历map,若flag为true,代表没有合并,就表示该时段独立的。map.put(starttime, endtime);

  • 相关阅读:
    bootstrap
    jQuery-介绍 加载 选择器 样式操作 属性操作 绑定click事件
    javascript -- BOM,DOM
    前端 -- javas-基本语法/引用等
    fatal: remote origin already exists.报错
    git
    npm install 时总是报phantomjs-prebuilt@2.1.14安装失败
    JavaScript中设置元素class,添加/删除元素class的方法
    单选按钮点击相关文字选中
    JS/Jquery实现select选中option触发事件
  • 原文地址:https://www.cnblogs.com/xlblog/p/8576114.html
Copyright © 2011-2022 走看看