java对cron计算处理
注意:xxljob的cron大部分和SpringBoot的是一样的,但是在周的处理上有点不同
xxljob:【1,7】代表【周日,周六】
SpringBoot:【1,7】代表【周一,周日】
所以xxljob的执行时间和不能直接用SpringBoot的工具类处理(目前发现只有周会这样,不是按周处理的话不要紧)
quartz
需要依赖
<!-- 依赖quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
cron是否正确校验
CronExpression.isValidExpression(cron)
返回Boolean格式
xxljob工具类
cron是否正确校验
CronExpression.isValidExpression(cron)
下次执行时间
CronExpression expression = new CronExpression(cron);
Date nextTime = expression.getNextInvalidTimeAfter(new Date()); //这个时间之后的第一次执行时间
SpringBoot工具类
CronSequenceGenerator
cron是否正确校验
CronSequenceGenerator.isValidExpression(cron)
下次执行时间
CronSequenceGenerator expression = new CronSequenceGenerator(cron);
Date nextTime = expression.next(new Date()); //这个时间之后的第一次执行时间
cron-utils
可以处理spring和quartz
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.1.6</version>
</dependency>
自定义工具类
/**
* cron的表达式 秒 分 时 日 月 周
*/
public static String cronModel = "%s %s %s %s %s %s";
public static ExecutionTime getExecutionTime(String cron) {
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
CronParser parser = new CronParser(cronDefinition);
return ExecutionTime.forCron(parser.parse(cron));
}
/**
* 给定的时间是否在cron表达式之中
*/
public static boolean isRunDate(ExecutionTime executionTime, Date date) {
return executionTime.isMatch(dateToZonedDateTime(date));
}
/**
* 获取下次执行时间,若是当前时间合适,返回这个时间
* @param cron
* @param date
* @return
*/
public static Date getNowOrNextDate(ExecutionTime executionTime, Date date) {
if (isRunDate(executionTime, date)) {
return date;
} else {
return getNextDate(executionTime, date);
}
}
/**
* 获取这个时间之后的下次执行时间
* @param cron
* @param date
* @return
*/
public static Date getNextDate(ExecutionTime executionTime, Date date) {
ZonedDateTime time = executionTime.nextExecution(dateToZonedDateTime(date)).orElse(null);
return zonedDateTimeToDate(time);
}
/**
* 或者这个时间之前的上次执行时间
* @param cron
* @param date
* @return
*/
public static Date getLastRunDate(ExecutionTime executionTime, Date date) {
ZonedDateTime time = executionTime.lastExecution(dateToZonedDateTime(date)).orElse(null);
return zonedDateTimeToDate(time);
}
/**
* 将ZonedDateTime转date
* @param date
* @return
*/
public static Date zonedDateTimeToDate(ZonedDateTime time) {
if (time == null) {
return null;
} else {
return Date.from(time.toInstant());
}
}