代码备份
定时器分开始时间和结束时间,而且可以设置按周一到周日的循环,怎么判断俩个时间段有重复
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));
}