From 72a8e3740cdb42723ff88101ae624586912e30d5 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 8 Apr 2022 08:12:33 +0800 Subject: [PATCH] fix code --- .../cn/hutool/core/date/CalendarUtil.java | 4 +-- .../java/cn/hutool/core/date/DateUtil.java | 4 +-- .../cn/hutool/cron/pattern/CronPattern.java | 4 +-- .../cron/pattern/matcher/PatternMatcher.java | 8 +++-- .../pattern/CronPatternNextMatchTest.java | 29 +++++++++++++++++-- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java index 57f1f25c2..c696fc0c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java @@ -97,7 +97,7 @@ public class CalendarUtil { * 修改日期为某个时间字段起始时间 * * @param calendar {@link Calendar} - * @param dateField 时间字段 + * @param dateField 保留到的时间字段,如定义为 {@link DateField#SECOND},表示这个字段不变,这个字段以下字段全部归0 * @return 原{@link Calendar} */ public static Calendar truncate(Calendar calendar, DateField dateField) { @@ -119,7 +119,7 @@ public class CalendarUtil { * 修改日期为某个时间字段结束时间 * * @param calendar {@link Calendar} - * @param dateField 时间字段 + * @param dateField 保留到的时间字段,如定义为 {@link DateField#SECOND},表示这个字段不变,这个字段以下字段全部取最大值 * @return 原{@link Calendar} */ public static Calendar ceiling(Calendar calendar, DateField dateField) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index dc69d9c3b..3eecb55c7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -999,7 +999,7 @@ public class DateUtil extends CalendarUtil { * 修改日期为某个时间字段起始时间 * * @param date {@link Date} - * @param dateField 时间字段 + * @param dateField 保留到的时间字段,如定义为 {@link DateField#SECOND},表示这个字段不变,这个字段以下字段全部归0 * @return {@link DateTime} * @since 4.5.7 */ @@ -1023,7 +1023,7 @@ public class DateUtil extends CalendarUtil { * 修改日期为某个时间字段结束时间 * * @param date {@link Date} - * @param dateField 时间字段 + * @param dateField 保留到的时间字段,如定义为 {@link DateField#SECOND},表示这个字段不变,这个字段以下字段全部取最大值 * @return {@link DateTime} * @since 4.5.7 */ diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java index 26964fbcf..78519af00 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java @@ -169,9 +169,9 @@ public class CronPattern { /** * 获取下一个最近的匹配日期时间 * - * @param values 时间字段值 + * @param values 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} * @param zone 时区 - * @return {@link Calendar} + * @return {@link Calendar},毫秒数为0 */ private Calendar nextMatchAfter(int[] values, TimeZone zone) { final List nextMatches = new ArrayList<>(matchers.size()); 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 dc390989d..0735fca8b 100644 --- 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 @@ -111,14 +111,16 @@ public class PatternMatcher { *
  • 如果此部分下个值小于给定值,回退到上一个值获取下一个新值,之后的值置为最小值
  • * * - * @param values 时间字段值 + * @param values 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} * @param zone 时区 - * @return {@link Calendar} + * @return {@link Calendar},毫秒数为0 */ public Calendar nextMatchAfter(int[] values, TimeZone zone) { - Calendar calendar = Calendar.getInstance(zone); + final Calendar calendar = Calendar.getInstance(zone); + calendar.set(Calendar.MILLISECOND, 0); int i = Part.YEAR.ordinal(); + // 新值,-1表示标识为回退 int nextValue = 0; while (i >= 0) { nextValue = matchers[i].nextAfter(values[i]); diff --git a/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternNextMatchTest.java b/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternNextMatchTest.java index a0a53e9e5..bb50fe3fa 100644 --- a/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternNextMatchTest.java +++ b/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternNextMatchTest.java @@ -1,5 +1,7 @@ package cn.hutool.cron.pattern; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import org.junit.Assert; import org.junit.Test; @@ -8,6 +10,22 @@ import java.util.Calendar; public class CronPatternNextMatchTest { + @Test + public void nextMatchAllAfterTest() { + // 匹配所有,返回下一秒的时间 + CronPattern pattern = new CronPattern("* * * * * * *"); + DateTime date = DateUtil.truncate(DateUtil.date(), DateField.SECOND); + Calendar calendar = pattern.nextMatchAfter(date.toCalendar()); + Assert.assertEquals(date.getTime(), DateUtil.date(calendar).getTime()); + + // 匹配所有分,返回下一分钟 + pattern = new CronPattern("0 * * * * * *"); + date = DateUtil.parse("2022-04-08 07:44:16"); + //noinspection ConstantConditions + calendar = pattern.nextMatchAfter(date.toCalendar()); + Assert.assertEquals(DateUtil.parse("2022-04-08 07:45:00"), DateUtil.date(calendar)); + } + @Test public void nextMatchAfterTest(){ CronPattern pattern = new CronPattern("23 12 * 12 * * *"); @@ -20,14 +38,21 @@ public class CronPatternNextMatchTest { Assert.assertTrue(pattern.match(calendar, true)); Assert.assertEquals("2022-04-12 09:12:23", DateUtil.date(calendar).toString()); - // 秒超出规定值的最大值,小时+1 + // 秒超出规定值的最大值,分+1,秒取最小值 + //noinspection ConstantConditions + calendar = pattern.nextMatchAfter( + DateUtil.parse("2022-04-12 09:09:24").toCalendar()); + Assert.assertTrue(pattern.match(calendar, true)); + Assert.assertEquals("2022-04-12 09:12:23", DateUtil.date(calendar).toString()); + + // 秒超出规定值的最大值,分不变,小时+1,秒和分使用最小值 //noinspection ConstantConditions calendar = pattern.nextMatchAfter( DateUtil.parse("2022-04-12 09:12:24").toCalendar()); Assert.assertTrue(pattern.match(calendar, true)); Assert.assertEquals("2022-04-12 10:12:23", DateUtil.date(calendar).toString()); - // 天超出规定值的最大值,月+1 + // 天超出规定值的最大值,月+1,天、时、分、秒取最小值 //noinspection ConstantConditions calendar = pattern.nextMatchAfter( DateUtil.parse("2022-04-13 09:12:24").toCalendar());