Cron表达式中周和数字是不对应的
周一:2;周二:3;周三:4;周四:5;周五:6;周六:7;周日:1
pom文件必须依赖
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.google-collections</groupId>
<artifactId>google-collect</artifactId>
<version>snapshot-20080530</version>
</dependency>
创建CronUtils工具类
package com.example.demo.utils;
import com.cronutils.model.CronType;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.parser.CronParser;
import com.google.common.collect.Lists;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* ClassName : CronUtils
* Description : Cron表达式工具类
* Author : x x x
* Date : 2021/6/3 3:10 下午
*/
@Component
public class CronUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(CronUtils.class);
private static final String QUESTION = "?";
private static final String ASTERISK = "*";
private static final String COMMA = ",";
/**
* 替换 分钟、小时、日期、星期
*/
private static final String ORIGINAL_CRON = "0 %s %s %s * %s";
/**
* 检查cron表达式的合法性
*/
public boolean checkValid(String cron) {
try {
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.SPRING);
CronParser parser = new CronParser(cronDefinition);
parser.parse(cron);
} catch (IllegalArgumentException e) {
LOGGER.error(String.format("cron=%s not valid", cron));
return false;
}
return true;
}
public String buildCron(List<Integer> minutes, List<Integer> hours, List<Integer> weekdays) {
String minute;
if (minutes.equals(this.getInitMinutes())) {
minute = ASTERISK;
} else {
minute = StringUtils.join(minutes, COMMA);
}
String hour;
if (hours.equals(this.getInitHours())) {
hour = ASTERISK;
} else {
hour = StringUtils.join(hours, COMMA);
}
String weekday;
if (weekdays.equals(this.getInitWeekdays())) {
weekday = QUESTION;
} else {
weekday = StringUtils.join(weekdays, COMMA);
}
// 重点:星期和日字段冲突,判断周日的前端输入
if (weekday.equals(QUESTION)) {
return String.format(ORIGINAL_CRON, minute, hour, ASTERISK, weekday);
} else {
return String.format(ORIGINAL_CRON, minute, hour, QUESTION, weekday);
}
}
/**
* 解析cron
*/
public CustomCronField parseCon(String cron) {
if (!this.checkValid(cron)) {
return null;
}
List<String> result = Arrays.asList(cron.trim().split(" "));
CustomCronField field = new CustomCronField();