最近工作中需要判斷用戶設置的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表達式轉時間遇到的所有情況,記錄每一個有意義的問題,大家共同成長,謝謝。