根据多个成对的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);