修复CronPattern.nextMatchAfter匹配初始值问题

This commit is contained in:
Looly 2024-04-22 01:50:23 +08:00
parent c02460423e
commit 0942cf2c60
5 changed files with 39 additions and 16 deletions

View File

@ -2,7 +2,7 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
# 5.8.28(2024-04-21)
# 5.8.28(2024-04-22)
### 🐣新特性
* 【core 】 修正XmlUtil的omitXmlDeclaration描述注释issue#I9CPC7@Gitee
@ -22,6 +22,7 @@
* 【core 】 修复RandomUtil.randomStringWithoutStr方法问题pr#1209@Gitee
* 【http 】 修复HttpRequest.header相同key被覆盖问题issue#I9I61C@Gitee
* 【core 】 修复TemporalAccessorConverter自定义格式转换问题issue#I9HQQE@Gitee
* 【cron 】 修复CronPattern.nextMatchAfter匹配初始值问题issue#I9FQUA@Gitee
-------------------------------------------------------------------------------------------------------------
# 5.8.27(2024-03-29)

View File

@ -149,6 +149,13 @@ public class CronPattern {
* @return 匹配到的下一个时间
*/
public Calendar nextMatchAfter(Calendar calendar) {
// issue#I9FQUA当提供的时间已经匹配表达式时增加1秒以匹配下一个时间
if(match(calendar, true)){
final Calendar newCalendar = Calendar.getInstance(calendar.getTimeZone());
newCalendar.setTimeInMillis(calendar.getTimeInMillis() + 1000);
calendar = newCalendar;
}
Calendar next = nextMatchAfter(PatternUtil.getFields(calendar, true), calendar.getTimeZone());
if (false == match(next, true)) {
next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1);

View File

@ -1,6 +1,6 @@
package cn.hutool.cron.pattern;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.CalendarUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
@ -11,32 +11,28 @@ import java.util.List;
/**
* 定时任务表达式工具类
*
*
* @author looly
*
*/
public class CronPatternUtil {
/**
* 列举指定日期之后到开始日期对应年年底内第一个匹配表达式的日期
*
* 列举指定日期之后内第一个匹配表达式的日期
*
* @param pattern 表达式
* @param start 起始时间
* @param isMatchSecond 是否匹配秒
* @param isMatchSecond 是否匹配秒无效
* @return 日期
* @since 4.5.8
*/
public static Date nextDateAfter(CronPattern pattern, Date start, boolean isMatchSecond) {
List<Date> matchedDates = matchedDates(pattern, start.getTime(), DateUtil.endOfYear(start).getTime(), 1, isMatchSecond);
if (CollUtil.isNotEmpty(matchedDates)) {
return matchedDates.get(0);
}
return null;
return DateUtil.date(pattern.nextMatchAfter(CalendarUtil.calendar(start)));
}
/**
* 列举指定日期之后到开始日期对应年年底内所有匹配表达式的日期
*
*
* @param patternStr 表达式字符串
* @param start 起始时间
* @param count 列举数量
@ -49,7 +45,7 @@ public class CronPatternUtil {
/**
* 列举指定日期范围内所有匹配表达式的日期
*
*
* @param patternStr 表达式字符串
* @param start 起始时间
* @param end 结束时间
@ -63,7 +59,7 @@ public class CronPatternUtil {
/**
* 列举指定日期范围内所有匹配表达式的日期
*
*
* @param patternStr 表达式字符串
* @param start 起始时间
* @param end 结束时间
@ -77,7 +73,7 @@ public class CronPatternUtil {
/**
* 列举指定日期范围内所有匹配表达式的日期
*
*
* @param pattern 表达式
* @param start 起始时间
* @param end 结束时间

View File

@ -16,7 +16,7 @@ public class CronPatternNextMatchTest {
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());
Assert.assertEquals(date.getTime() + 1000, DateUtil.date(calendar).getTime());
// 匹配所有分返回下一分钟
pattern = new CronPattern("0 * * * * * *");

View File

@ -0,0 +1,19 @@
package cn.hutool.cron.pattern;
import cn.hutool.core.date.DateUtil;
import org.junit.Assert;
import org.junit.Test;
import java.util.Calendar;
public class IssueI9FQUATest {
@Test
public void nextDateAfterTest() {
final String cron = "0/5 * * * * ?";
final Calendar calendar = CronPattern.of(cron).nextMatchAfter(
DateUtil.parse("2024-01-01 00:00:00").toCalendar());
//Console.log(DateUtil.date(calendar));
Assert.assertEquals("2024-01-01 00:00:05", DateUtil.date(calendar).toString());
}
}