mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
修复CronPatternUtil.nextDateAfter栈溢出问题
This commit is contained in:
parent
57d9a415fc
commit
4c00f6adb2
@ -31,6 +31,7 @@
|
|||||||
* 【core 】 修复CsvParser中对正文中双引号处理逻辑问题(pr#1244@Gitee)
|
* 【core 】 修复CsvParser中对正文中双引号处理逻辑问题(pr#1244@Gitee)
|
||||||
* 【core 】 修复ZipUtil.zip压缩到本目录时可能造成的死循环问题(issue#IAGYDG@Gitee)
|
* 【core 】 修复ZipUtil.zip压缩到本目录时可能造成的死循环问题(issue#IAGYDG@Gitee)
|
||||||
* 【cache 】 修复AbstractCache.get中锁不一致导致的并发问题(issue#3686@Github)
|
* 【cache 】 修复AbstractCache.get中锁不一致导致的并发问题(issue#3686@Github)
|
||||||
|
* 【cron 】 修复CronPatternUtil.nextDateAfter栈溢出问题(issue#3685@Github)
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
# 5.8.29(2024-07-03)
|
# 5.8.29(2024-07-03)
|
||||||
|
@ -156,13 +156,25 @@ public class CronPattern {
|
|||||||
calendar = newCalendar;
|
calendar = newCalendar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nextMatch(calendar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回匹配到的下一个时间,如果给定时间匹配,直接返回
|
||||||
|
*
|
||||||
|
* @param calendar 时间
|
||||||
|
* @return 匹配到的下一个时间
|
||||||
|
* @since 5.8.30
|
||||||
|
*/
|
||||||
|
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 (false == match(next, true)) {
|
if (match(next, true)) {
|
||||||
next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1);
|
return next;
|
||||||
next = CalendarUtil.beginOfDay(next);
|
|
||||||
return nextMatchAfter(next);
|
|
||||||
}
|
}
|
||||||
return next;
|
|
||||||
|
next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1);
|
||||||
|
next = CalendarUtil.beginOfDay(next);
|
||||||
|
return nextMatch(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -17,6 +17,18 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class CronPatternUtil {
|
public class CronPatternUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列举指定日期之后内第一个匹配表达式的日期
|
||||||
|
*
|
||||||
|
* @param pattern 表达式
|
||||||
|
* @param start 起始时间
|
||||||
|
* @return 日期
|
||||||
|
* @since 5.8.30
|
||||||
|
*/
|
||||||
|
public static Date nextDateAfter(CronPattern pattern, Date start) {
|
||||||
|
return DateUtil.date(pattern.nextMatchAfter(CalendarUtil.calendar(start)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 列举指定日期之后内第一个匹配表达式的日期
|
* 列举指定日期之后内第一个匹配表达式的日期
|
||||||
*
|
*
|
||||||
@ -25,7 +37,9 @@ public class CronPatternUtil {
|
|||||||
* @param isMatchSecond 是否匹配秒(无效)
|
* @param isMatchSecond 是否匹配秒(无效)
|
||||||
* @return 日期
|
* @return 日期
|
||||||
* @since 4.5.8
|
* @since 4.5.8
|
||||||
|
* @deprecated isMatchSecond无效,使用 {@link #nextDateAfter(CronPattern, Date)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static Date nextDateAfter(CronPattern pattern, Date start, boolean isMatchSecond) {
|
public static Date nextDateAfter(CronPattern pattern, Date start, boolean isMatchSecond) {
|
||||||
return DateUtil.date(pattern.nextMatchAfter(CalendarUtil.calendar(start)));
|
return DateUtil.date(pattern.nextMatchAfter(CalendarUtil.calendar(start)));
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package cn.hutool.cron.pattern;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class Issue3685Test {
|
||||||
|
@Test
|
||||||
|
public 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());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user