This commit is contained in:
Looly 2023-08-24 23:45:10 +08:00
parent aacfa07af2
commit 07de6aa4f0

View File

@ -139,7 +139,8 @@ public class PartParser {
if (size == 1) {// 普通形式 if (size == 1) {// 普通形式
results = parseRange(value, -1); results = parseRange(value, -1);
} else if (size == 2) {// 间隔形式 } else if (size == 2) {// 间隔形式
final int step = parseNumber(parts.get(1)); // issue#I7SMP7步进不检查范围
final int step = parseNumber(parts.get(1), false);
if (step < 1) { if (step < 1) {
throw new CronException("Non positive divisor for field: [{}]", value); throw new CronException("Non positive divisor for field: [{}]", value);
} }
@ -172,7 +173,7 @@ public class PartParser {
//根据步进的第一个数字确定起始时间类似于 12/3则从12分等开始 //根据步进的第一个数字确定起始时间类似于 12/3则从12分等开始
int minValue = part.getMin(); int minValue = part.getMin();
if (!isMatchAllStr(value)) { if (!isMatchAllStr(value)) {
minValue = Math.max(minValue, parseNumber(value)); minValue = Math.max(minValue, parseNumber(value, true));
} else { } else {
//在全匹配模式下如果步进不存在表示步进为1 //在全匹配模式下如果步进不存在表示步进为1
if (step < 1) { if (step < 1) {
@ -199,15 +200,15 @@ public class PartParser {
final List<String> parts = SplitUtil.split(value, StrUtil.DASHED); final List<String> parts = SplitUtil.split(value, StrUtil.DASHED);
final int size = parts.size(); final int size = parts.size();
if (size == 1) {// 普通值 if (size == 1) {// 普通值
final int v1 = parseNumber(value); final int v1 = parseNumber(value, true);
if (step > 0) {//类似 20/2的形式 if (step > 0) {//类似 20/2的形式
NumberUtil.appendRange(v1, part.getMax(), step, results); NumberUtil.appendRange(v1, part.getMax(), step, results);
} else { } else {
results.add(v1); results.add(v1);
} }
} else if (size == 2) {// range值 } else if (size == 2) {// range值
final int v1 = parseNumber(parts.get(0)); final int v1 = parseNumber(parts.get(0),true);
final int v2 = parseNumber(parts.get(1)); final int v2 = parseNumber(parts.get(1), true);
if (step < 1) { if (step < 1) {
//在range模式下如果步进不存在表示步进为1 //在range模式下如果步进不存在表示步进为1
step = 1; step = 1;
@ -242,10 +243,11 @@ public class PartParser {
* 解析单个int值支持别名 * 解析单个int值支持别名
* *
* @param value 被解析的值 * @param value 被解析的值
* @param checkValue 是否检查值在有效范围内
* @return 解析结果 * @return 解析结果
* @throws CronException 当无效数字或无效别名时抛出 * @throws CronException 当无效数字或无效别名时抛出
*/ */
private int parseNumber(final String value) throws CronException { private int parseNumber(final String value, final boolean checkValue) throws CronException {
int i; int i;
try { try {
i = Integer.parseInt(value); i = Integer.parseInt(value);
@ -263,13 +265,7 @@ public class PartParser {
i = Week.SUNDAY.ordinal(); i = Week.SUNDAY.ordinal();
} }
// issue#I7SMP7 return checkValue ? part.checkValue(i) : i;
// 年的形式中如果类似于*/2不做范围检查
if(Part.YEAR.equals(this.part)){
return i;
}
return part.checkValue(i);
} }
/** /**