关于定时任务一个批次起止时间的算法设计与实现

适用场景:业务中不乏会添加各种各样的定时任务。添加了一个定时任务后,该定时任务可能是每天执行、每周执行或者是每月执行。无论是每天、每周、每月,本质都是在某一刻去操作某一个时间段的数据。那么现在想查看该任务在本批次想要操作的数据,就得计算出本批次的时间段。

注:本批次时间段(起始时间:任务上一次触发的时刻;结束时间:任务下一次执行的时间。)

任务包含的时间参数

clearCycle:执行周期(每天、每周、每月)

clearDay选择执行日期(每周第几天-weekDay、每月第几天-monthDay)

clearCycleDate选择执行时间(HH:mm:ss)

执行时间

 

算法逻辑:

1、首先获取当前时间(yyyy-MM-dd HH:mm:ss)。

2、从当前时间中剥离当前的年、月、日、时、分、秒。

3、然后获取任务执行时间clearCycleDate(HH:mm:ss),拼接当前年、月、日。将时间格式化成(yyyy-MM-dd HH:mm:ss)

4、获取任务执行周期clearCycle(每天、每周、每月)。

5、根据任务执行周期clearDay。

6、根据当前时间与真实的任务执行时间(clearCycle--clearDay--clearCycleDate)作比较。根据时间偏移量计算出该任务下一次执行时间。

7、计算出下一次执行时间后,将该时间向前偏移一个执行周期(clearCycle)即可计算出任务上一次执行时间。

java代码实现如下:

/* 本批次清理数据的开始时间与结束时间 */
Date startDate = null;
Date endDate = null;
String clearDate = task.getClearCycleDate();//清理时间 HH:mm:ss
int clearDay;//每周第几天或每月第几天
Calendar calendar = Calendar.getInstance();
//当前日期字符串,格式:yyyy-MM-dd
String today= DateUtil.today();
String nowClearDate = today+" "+clearDate;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//计算清理的真实时间
Date realClearDate = new Date();
try {
	realClearDate = format.parse(nowClearDate);
} catch (ParseException e1) {
	e1.printStackTrace();
}
switch (task.getClearCycle()) {
	case "DAY":
		Date date = new Date();
		if(date.compareTo(realClearDate) > 0) {
			startDate = realClearDate;
		}else {
			startDate = DateUtil.offsetDay(realClearDate, -1);
		}
		endDate = DateUtil.offsetDay(startDate, 1);
		break;
	case "WEEK":
		clearDay = Integer.parseInt(task.getClearDay());//每周第几天
		int[] week = {7,1,2,3,4,5,6};
		int week_day = week[calendar.get(Calendar.DAY_OF_WEEK)-1];
		if(week_day>=clearDay) {
			//向前偏移到上一次清理时间
			startDate = DateUtil.offsetDay(realClearDate, clearDay-week_day);
		}else {
			//先向后偏移到下一次清理时间,然后再向前偏移一周就是本批次起始时间
			startDate = DateUtil.offsetDay(realClearDate, clearDay-week_day);
			startDate = DateUtil.offsetDay(startDate, -7);
		}
		endDate = DateUtil.offsetDay(startDate, 7);
		break;
	case "MONTH":
		clearDay = Integer.parseInt(task.getClearDay());//每月第几天
		int month_day = calendar.get(Calendar.DAY_OF_MONTH);
		if(month_day>=clearDay) {
			//向前偏移到上一次清理时间
			startDate = DateUtil.offsetDay(realClearDate, clearDay-month_day);
		}else {
			//先向后偏移到下一次清理时间,然后再向前偏移一个月就是本批次起始时间
			startDate = DateUtil.offsetDay(startDate, clearDay-month_day);
			startDate = DateUtil.offsetMonth(startDate, -1);
		}
		endDate = DateUtil.offsetMonth(startDate, 1);
		break;
	default:
		break;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章