關於定時任務一個批次起止時間的算法設計與實現

適用場景:業務中不乏會添加各種各樣的定時任務。添加了一個定時任務後,該定時任務可能是每天執行、每週執行或者是每月執行。無論是每天、每週、每月,本質都是在某一刻去操作某一個時間段的數據。那麼現在想查看該任務在本批次想要操作的數據,就得計算出本批次的時間段。

注:本批次時間段(起始時間:任務上一次觸發的時刻;結束時間:任務下一次執行的時間。)

任務包含的時間參數

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;
}

 

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