JAVA將cron表達式轉date類型時間

       最近工作中需要判斷用戶設置的CRON表達式的第一次執行時間是在什麼時候,於是用到了CRON表達式對於DATE類型時間的轉換,但是在網上找了一下,雖然找到了方法,但是由於沒有仔細講解,差點錯過。

       所以今天將那位老兄的代碼改了改,準備加上點自己的理解,分享給大家。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.quartz.CronExpression;

public class CronDateUtil {
	public static List<String> parser(String cronExpression) { 
		List<String> result = new ArrayList<String>(); 
		if (cronExpression == null || cronExpression.length() < 1) { 
			return result; 
		} else { 
			CronExpression exp = null; 
			Calendar calendar = Calendar.getInstance(); 
			String cronDate = calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DATE); 
			String sStart = cronDate + " 00:00:00"; 
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
			Date dStart = null; 
			Date dEnd = null; 
			try { 
				exp = new CronExpression(cronExpression); 
				dStart = sdf.parse(sStart); 
				calendar.setTime(dStart); 
				calendar.add(Calendar.DATE, 1); 
				dEnd = calendar.getTime(); 
			} catch (ParseException e) {
				e.printStackTrace(); 
				return result; 
			} 
			Date dd = new Date(); 
			dd = exp.getNextValidTimeAfter(dd); 
			while (dd.getTime() < dEnd.getTime()) { 
				result.add(sdf.format(dd)); 
				dd = exp.getNextValidTimeAfter(dd); 
			} 
			exp = null; 
		} 
		return result; 
	}
	
	public static void main(String[] args) {
		String CRON_EXPRESSION = "0 15-30 13-13 ? * MON-FRI"; 
		System.out.println(CRON_EXPRESSION); 
		List<String> lTime = new ArrayList<String>(); 
		lTime = parser(CRON_EXPRESSION); 
		for (int i = 0; i < lTime.size(); i++) { 
			System.out.println(lTime.get(i)); 
		} 
	}
}

      

       首先可以看到在進行cron表達式的非空判斷後,我們定義了一個時間,這個時間是獲取了當年當月當天之後與零點拼接在一起的,表示時間的查詢是從當天零點開始;然後再try catch中我們調用了quartz包中的CronExpression類,可以看出他的作用是解析cron表達式中的各位置字符的含義。

       然後便使用calendar方法獲取了後一天零點時間,也可以說是當天的24點,這樣把時間控制在了當天一整天,同時將兩個時間轉爲date類型。

       這時我們獲取一個當前時間,然後調用CronExpression的getNextValidTimeAfter方法,獲取的是當前時間點與表達式時間對比後的時間,只取當前時間之後的表達式中還會執行的時間。

       比如現在是10點40,我們的cron表達式爲"0 35-50 10-10 ? * MON-FRI" 每週一到週五的十點三十五到五十,每分鐘一次,於是會輸出四十以後的時間。

       最後他會把整個時間集合存入到一個集合中輸出;注意,如果集合爲空,則證明當前時間已超過了cron表達式的執行時間。比如當前是週二,而我cron設置的是週三到週五,輸出集合就爲空;如果當前時間是十點四十,cron設置的時間是十點到十點半,那麼輸出的集合也爲空。

       當然我需要的是cron執行的第一個時間我就只需要定義一個當天零點時間,轉爲date類型,然後調用方法獲取集合的第一個時間就OK了。

       以上就是我在解決cron表達式轉時間遇到的所有情況,記錄每一個有意義的問題,大家共同成長,謝謝。

 

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