From e31658ce9e19773ed28bb2ca5d98a9f0df3d91ff Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 21 Aug 2025 10:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`CronPatternUtil.nextDateAfte?= =?UTF-8?q?r`=E8=AE=A1=E7=AE=97=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=9A=84=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=88issue#4006@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../hutool/cron/pattern/matcher/PatternMatcher.java | 12 ++---------- .../java/cn/hutool/cron/pattern/Issue4006Test.java | 5 +++-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 052741b07..0196bfb51 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.40(2025-08-20) +# 5.8.40(2025-08-21) ### 🐣新特性 * 【captcha】 `MathGenerator`四则运算方式支持不生成负数结果(pr#1363@Gitee) @@ -20,6 +20,7 @@ * 【core 】 修复`TreeBuilder`append重复向idTreeMap中put问题(pr#3992@Github) * 【extra 】 修复`QLExpressEngine`allowClassSet无效问题(issue#3994@Github) * 【core 】 修复`StrBuilder`insert插入计算错误问题(issue#ICTSRZ@Gitee) +* 【cron 】 修复`CronPatternUtil.nextDateAfter`计算下一个匹配表达式的日期时,计算错误问题(issue#4006@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.39(2025-06-20) diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java index 8ffb80b9a..146beec0b 100755 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java @@ -192,7 +192,7 @@ public class PatternMatcher { // pr#1189 if (i == Part.DAY_OF_MONTH.ordinal() && matchers[i] instanceof DayOfMonthMatcher - && ((DayOfMonthMatcher) matchers[i]).isLastDay(values[i],values[i+1],isLeapYear(values[Part.YEAR.ordinal()]))) { + && ((DayOfMonthMatcher) matchers[i]).isLastDay(values[i],values[i+1],DateUtil.isLeapYear(values[Part.YEAR.ordinal()]))) { int newMonth = newValues[Part.MONTH.ordinal()]; int newYear = newValues[Part.YEAR.ordinal()]; nextValue = getLastDay(newMonth, newYear); @@ -226,7 +226,7 @@ public class PatternMatcher { continue; } else if (i == Part.DAY_OF_MONTH.ordinal() && matchers[i] instanceof DayOfMonthMatcher - && ((DayOfMonthMatcher) matchers[i]).isLastDay(values[i],values[i+1],isLeapYear(values[Part.YEAR.ordinal()]))) { + && ((DayOfMonthMatcher) matchers[i]).isLastDay(values[i],values[i+1],DateUtil.isLeapYear(values[Part.YEAR.ordinal()]))) { int newMonth = newValues[Part.MONTH.ordinal()]; int newYear = newValues[Part.YEAR.ordinal()]; nextValue = getLastDay(newMonth, newYear); @@ -247,14 +247,6 @@ public class PatternMatcher { return newValues; } - /** - * 判断年份是否是闰年 - * @param year - * @return 返回boolean表示是否是闰年 - */ - private static boolean isLeapYear(int year) { - return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); - } /** * 设置从{@link Part#SECOND}到指定部分,全部设置为最小值 * diff --git a/hutool-cron/src/test/java/cn/hutool/cron/pattern/Issue4006Test.java b/hutool-cron/src/test/java/cn/hutool/cron/pattern/Issue4006Test.java index cea735ebc..44347ef2b 100644 --- a/hutool-cron/src/test/java/cn/hutool/cron/pattern/Issue4006Test.java +++ b/hutool-cron/src/test/java/cn/hutool/cron/pattern/Issue4006Test.java @@ -1,6 +1,7 @@ package cn.hutool.cron.pattern; import cn.hutool.core.date.DateTime; +import cn.hutool.core.lang.Console; import org.junit.jupiter.api.Test; import java.util.Date; @@ -13,8 +14,8 @@ public class Issue4006Test { DateTime judgeTime = DateTime.of(new Date()); CronPattern cronPattern = new CronPattern(cron); - System.out.println("cronPattern = " + cronPattern); + Console.log("cronPattern = " + cronPattern); Date nextDate = CronPatternUtil.nextDateAfter(cronPattern, judgeTime, true); - System.out.println("nextDate = " + nextDate); + Console.log("nextDate = " + nextDate); } }