1、Cron表达式解析-工具类
1、需引入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
2、Demo:
public class CronAnalyzeUtil {
/**
* 调度表达式解析
* @param expression 调度cron表达式
* @return
*/
public static String cronAnalyze(String expression){
CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(expression);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = cronSequenceGenerator.next(new Date());
} catch (Exception e) {
e.printStackTrace();
}
String str = null;
if (date != null) {
str = sdf.format(date);
}
return str;
}
/**
* 通过cron获取时间
* @param cronExpression cron表达式
* @param numTimes 下一(几)次运行的时间
* @param format 时间格式
* @return
*/
public static List<String> getNextExecTime(String cronExpression,Integer numTimes,String format) {
List<String> list = new ArrayList<>();
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
try {
cronTriggerImpl.setCronExpression(cronExpression);
} catch(ParseException e) {
e.printStackTrace();
}
List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes);
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
for (Date date : dates) {
list.add(dateFormat.format(date));
}
return list;
}
/**
* 获取调度时间频率
* @param cronExpression
* @param format
* @return
*/
public static int scheduleTimeRate(String cronExpression,String format){
List<String> nextExecTime = CronAnalyzeUtil.getNextExecTime(cronExpression, 2, format);
Integer value0 = Integer.valueOf(nextExecTime.get(0));
Integer value1 = Integer.valueOf(nextExecTime.get(1));
return value1-value0;
}
}
1.1、Cron表达式-判断时间是否匹配该表达式
1、判断时间是否匹配该表达式
1-1、cronExpression.isSatisfiedBy();
2、Demo:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CronExpression cronExpression = new CronExpression("* 5 16,6 8 10 ? 2015-2016");
boolean resCron = cronExpression.isSatisfiedBy(simpleDateFormat.parse("2015-10-08 16:05:59"));
System.out.println(resCron);
1.2、验证一个cron表达式-是否合法-方式
1、验证一个cron表达式-是否合法-方式:有很多种方式,列举常见的两种:
1-1、正则表达式方法
String regEx = "(((^([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]))|^([0-9]|[0-5][0-9])|^(\\* ))((([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9]) |(\\* ))((([0-9]|[01][0-9]|2[0-3])(\\,|\\-|\\/){1}([0-9]|[01][0-9]|2[0-3]) )|([0-9]|[01][0-9]|2[0-3]) |(\\* ))((([0-9]|[0-2][0-9]|3[01])(\\,|\\-|\\/){1}([0-9]|[0-2][0-9]|3[01]) )|(([0-9]|[0-2][0-9]|3[01]) )|(\\? )|(\\* )|(([1-9]|[0-2][0-9]|3[01])L )|([1-7]W )|(LW )|([1-7]\\#[1-4] ))((([1-9]|0[1-9]|1[0-2])(\\,|\\-|\\/){1}([1-9]|0[1-9]|1[0-2]) )|([1-9]|0[1-9]|1[0-2]) |(\\* ))(([1-7](\\,|\\-|\\/){1}[1-7])|([1-7])|(\\?)|(\\*)|(([1-7]L)|([1-7]\\#[1-4]))))|(((^([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|^([0-9]|[0-5][0-9]) |^(\\* ))((([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9]) |(\\* ))((([0-9]|[01][0-9]|2[0-3])(\\,|\\-|\\/){1}([0-9]|[01][0-9]|2[0-3]) )|([0-9]|[01][0-9]|2[0-3]) |(\\* ))((([0-9]|[0-2][0-9]|3[01])(\\,|\\-|\\/){1}([0-9]|[0-2][0-9]|3[01]) )|(([0-9]|[0-2][0-9]|3[01]) )|(\\? )|(\\* )|(([1-9]|[0-2][0-9]|3[01])L )|([1-7]W )|(LW )|([1-7]\\#[1-4] ))((([1-9]|0[1-9]|1[0-2])(\\,|\\-|\\/){1}([1-9]|0[1-9]|1[0-2]) )|([1-9]|0[1-9]|1[0-2]) |(\\* ))(([1-7](\\,|\\-|\\/){1}[1-7] )|([1-7] )|(\\? )|(\\* )|(([1-7]L )|([1-7]\\#[1-4]) ))((19[789][0-9]|20[0-9][0-9])\\-(19[789][0-9]|20[0-9][0-9])))";
String tests = "0 0 0 L * ?";
System.out.println(tests.matches(regEx));
1-2、CronExpression验证
1-2-1、这个方法需要引入quartz的jar包:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
1-2-2、示例代码:
boolean validExpression = CronExpression.isValidExpression(crontab);
2、Cron表达式解析-详细解析
https://www.cnblogs.com/javahr/p/8318728.html
3、CronExpression类-源码
https://www.jianshu.com/p/fb92bdf7a093