From 90646bc45dfe41889b42da8cb5bf1b405dbf2894 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 20 Sep 2023 21:22:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DCron=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8Frange=E8=A7=A3=E6=9E=90=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../java/cn/hutool/cron/pattern/Part.java | 2 +- .../cron/pattern/parser/PartParser.java | 12 +++-------- .../hutool/cron/pattern/IssueI82CSHTest.java | 21 +++++++++++++++++++ 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 hutool-cron/src/test/java/cn/hutool/cron/pattern/IssueI82CSHTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a4869433..5129a321d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,12 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.23(2023-09-13) +# 5.8.23(2023-09-20) ### 🐣新特性 ### 🐞Bug修复 +* 【cron 】 修复Cron表达式range解析错误问题(issue#I82CSH@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.22(2023-09-13) diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/Part.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/Part.java index aa7ee5c3d..7178aab32 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/Part.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/Part.java @@ -89,7 +89,7 @@ public enum Part { */ public int checkValue(int value) throws CronException { Assert.checkBetween(value, min, max, - () -> new CronException("Value {} out of range: [{} , {}]", value, min, max)); + () -> new CronException("{} value {} out of range: [{} , {}]", this.name(), value, min, max)); return value; } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java index 05eee0851..7c33ed05c 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/PartParser.java @@ -7,11 +7,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.CronException; import cn.hutool.cron.pattern.Part; -import cn.hutool.cron.pattern.matcher.AlwaysTrueMatcher; -import cn.hutool.cron.pattern.matcher.BoolArrayMatcher; -import cn.hutool.cron.pattern.matcher.DayOfMonthMatcher; -import cn.hutool.cron.pattern.matcher.PartMatcher; -import cn.hutool.cron.pattern.matcher.YearValueMatcher; +import cn.hutool.cron.pattern.matcher.*; import java.util.ArrayList; import java.util.List; @@ -203,13 +199,11 @@ public class PartParser { //在range模式下,如果步进不存在,表示步进为1 step = 1; } - if (v1 < v2) {// 正常范围,例如:2-5 + if (v1 <= v2) {// 正常范围,例如:2-5,3-3 NumberUtil.appendRange(v1, v2, step, results); - } else if (v1 > v2) {// 逆向范围,反选模式,例如:5-2 + } else {// 逆向范围,反选模式,例如:5-2 NumberUtil.appendRange(v1, part.getMax(), step, results); NumberUtil.appendRange(part.getMin(), v2, step, results); - } else {// v1 == v2,此时与单值模式一致 - NumberUtil.appendRange(v1, part.getMax(), step, results); } } else { throw new CronException("Invalid syntax of field: [{}]", value); diff --git a/hutool-cron/src/test/java/cn/hutool/cron/pattern/IssueI82CSHTest.java b/hutool-cron/src/test/java/cn/hutool/cron/pattern/IssueI82CSHTest.java new file mode 100644 index 000000000..4dfc28c0d --- /dev/null +++ b/hutool-cron/src/test/java/cn/hutool/cron/pattern/IssueI82CSHTest.java @@ -0,0 +1,21 @@ +package cn.hutool.cron.pattern; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Date; +import java.util.List; + +public class IssueI82CSHTest { + + @Test + public void test() { + final DateTime begin = DateUtil.parse("2023-09-20"); + final DateTime end = DateUtil.parse("2025-09-20"); + final List dates = CronPatternUtil.matchedDates("0 0 1 3-3,9 *", begin, end, 20, false); + //dates.forEach(Console::log); + Assert.assertEquals(4, dates.size()); + } +}