This commit is contained in:
Looly 2022-04-08 08:12:33 +08:00
parent b419d8e5f5
commit 72a8e3740c
5 changed files with 38 additions and 11 deletions

View File

@ -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) {

View File

@ -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
*/

View File

@ -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<Calendar> nextMatches = new ArrayList<>(matchers.size());

View File

@ -111,14 +111,16 @@ public class PatternMatcher {
* <li>如果此部分下个值小于给定值回退到上一个值获取下一个新值之后的值置为最小值</li>
* </ul>
*
* @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]);

View File

@ -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());