最近工作中需要判断用户设置的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表达式转时间遇到的所有情况,记录每一个有意义的问题,大家共同成长,谢谢。