目录
一、前言
二、引入maven依赖
三、源码
四、测试
一、前言
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
在开发中,需要检验cron表达式的合法性以及获取执行时间。在CronUtil中实现了这些功能。
二、引入maven依赖
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.1.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
三、源码
package com.asyf.demo.other_api.cron.cronutils;
import com.cronutils.descriptor.CronDescriptor;
import com.cronutils.model.Cron;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.parser.CronParser;
import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import static com.cronutils.model.CronType.QUARTZ;
public class CronUtil {
public static void main(String[] args) throws ParseException {
String expressiion = "0 0 0 ? 5 2#1";
//expressiion = "0 0 0 0 5 2#1";
//格式校验
boolean b = checkValid(expressiion);
System.out.println(b);
if (b) {
//解释cron表达式
String s = describeCron(expressiion);
System.out.println(s);
//获取下次运行时间
List<Date> nextExecTime = getNextExecTime(expressiion, 5);
nextExecTime.stream().forEach(d -> {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));
});
}
}
/**
* 解释cron表达式
*/
public static String describeCron(String expressiion) {
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
CronParser parser = new CronParser(cronDefinition);
Cron cron = parser.parse(expressiion);
//设置语言
CronDescriptor descriptor = CronDescriptor.instance(Locale.CHINESE);
return descriptor.describe(cron);
}
/**
* 检查cron表达式的合法性
*
* @param cron cron exp
* @return true if valid
*/
public static boolean checkValid(String cron) {
try {
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
CronParser parser = new CronParser(cronDefinition);
parser.parse(cron);
} catch (IllegalArgumentException e) {
System.out.println(String.format("cron=%s not valid", cron));
return false;
}
return true;
}
/**
* @param cronExpression cron表达式
* @param numTimes 下一(几)次运行的时间
* @return
*/
public static List<Date> getNextExecTime(String cronExpression, Integer numTimes) throws ParseException {
List<String> list = new ArrayList<>();
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
cronTriggerImpl.setCronExpression(cronExpression);
// 这个是重点,一行代码搞定
return TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes);
}
}
四、测试
true
在 00:00 在 五月 月 星期一 1 每个月
2021-05-03 00:00:00
2022-05-02 00:00:00
2023-05-01 00:00:00
2024-05-06 00:00:00
2025-05-05 00:00:00