修复CronPatternUtil.nextDateAfter栈溢出问题

This commit is contained in:
Looly 2024-08-08 19:15:19 +08:00
parent 67463d5dc4
commit 9eb95bf9d7
3 changed files with 52 additions and 5 deletions

View File

@ -164,13 +164,24 @@ public class CronPattern {
calendar = newCalendar; calendar = newCalendar;
} }
return nextMatch(calendar);
}
/**
* 返回匹配到的下一个时间如果给定时间匹配直接返回
*
* @param calendar 时间
* @return 匹配到的下一个时间
*/
public Calendar nextMatch(final Calendar calendar) {
Calendar next = nextMatchAfter(PatternUtil.getFields(calendar, true), calendar.getTimeZone()); Calendar next = nextMatchAfter(PatternUtil.getFields(calendar, true), calendar.getTimeZone());
if (!match(next, true)) { if (match(next, true)) {
return next;
}
next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1); next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1);
next = CalendarUtil.beginOfDay(next); next = CalendarUtil.beginOfDay(next);
return nextMatchAfter(next); return nextMatch(next);
}
return next;
} }
@Override @Override

View File

@ -16,6 +16,7 @@ import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.cron.pattern.Part; import org.dromara.hutool.cron.pattern.Part;
import java.time.Year; import java.time.Year;
import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.TimeZone; import java.util.TimeZone;
@ -170,6 +171,13 @@ public class PatternMatcher {
return calendar; return calendar;
} }
@Override
public String toString() {
return "PatternMatcher{" +
"matchers=" + Arrays.toString(matchers) +
'}';
}
/** /**
* 获取下一个匹配日期时间<br> * 获取下一个匹配日期时间<br>
* 获取方法是先从年开始查找对应部分的下一个值 * 获取方法是先从年开始查找对应部分的下一个值

View File

@ -0,0 +1,28 @@
package org.dromara.hutool.cron.pattern;
import org.dromara.hutool.core.date.DateUtil;
import org.junit.jupiter.api.Test;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class Issue3685Test {
@Test
void nextDateAfterTest() {
Date date = CronPatternUtil.nextDateAfter(CronPattern.of("0 0 * * MON"), DateUtil.parse("2024-08-01"));
assertEquals("2024-08-05 00:00:00", date.toString());
date = CronPatternUtil.nextDateAfter(CronPattern.of("0 0 * * MON"), DateUtil.parse("2024-08-02"));
assertEquals("2024-08-05 00:00:00", date.toString());
date = CronPatternUtil.nextDateAfter(CronPattern.of("0 0 * * MON"), DateUtil.parse("2024-08-03"));
assertEquals("2024-08-05 00:00:00", date.toString());
date = CronPatternUtil.nextDateAfter(CronPattern.of("0 0 * * MON"), DateUtil.parse("2024-08-04"));
assertEquals("2024-08-05 00:00:00", date.toString());
date = CronPatternUtil.nextDateAfter(CronPattern.of("0 0 * * MON"), DateUtil.parse("2024-08-05"));
assertEquals("2024-08-12 00:00:00", date.toString());
}
}