diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Week.java b/hutool-core/src/main/java/cn/hutool/core/date/Week.java
index c6cf0ee76..396a80df2 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/Week.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/Week.java
@@ -74,7 +74,7 @@ public enum Week {
/**
* 获得星期对应{@link Calendar} 中的Week值
*
- * @return 星期对应{@link Calendar} 中的Week值
+ * @return 星期对应 {@link Calendar} 中的Week值
*/
public int getValue() {
return this.value;
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 5c0e7cffd..e5c466597 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
@@ -5,6 +5,7 @@ import cn.hutool.core.date.CalendarUtil;
import cn.hutool.cron.pattern.matcher.PatternMatcher;
import cn.hutool.cron.pattern.parser.PatternParser;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
@@ -129,6 +130,18 @@ public class CronPattern {
return match(PatternUtil.getFields(calendar, isMatchSecond));
}
+ /**
+ * 给定时间是否匹配定时任务表达式
+ *
+ * @param dateTime 时间
+ * @param isMatchSecond 是否匹配秒
+ * @return 如果匹配返回 {@code true}, 否则返回 {@code false}
+ * @since 5.8.0
+ */
+ public boolean match(LocalDateTime dateTime, boolean isMatchSecond) {
+ return match(PatternUtil.getFields(dateTime, isMatchSecond));
+ }
+
/**
* 返回匹配到的下一个时间
*
@@ -137,7 +150,7 @@ public class CronPattern {
*/
public Calendar nextMatchAfter(Calendar calendar) {
Calendar next = nextMatchAfter(PatternUtil.getFields(calendar, true), calendar.getTimeZone());
- if(false == match(next, true)){
+ if (false == match(next, true)) {
next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1);
next = CalendarUtil.beginOfDay(next);
return nextMatchAfter(next);
diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/PatternUtil.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/PatternUtil.java
index 09f82d73a..63030b9de 100755
--- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/PatternUtil.java
+++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/PatternUtil.java
@@ -1,5 +1,8 @@
package cn.hutool.cron.pattern;
+import cn.hutool.core.date.Week;
+
+import java.time.LocalDateTime;
import java.util.Calendar;
/**
@@ -10,6 +13,26 @@ import java.util.Calendar;
*/
class PatternUtil {
+ /**
+ * 获取处理后的字段列表
+ * 月份从1开始,周从0开始
+ *
+ * @param dateTime {@link Calendar}
+ * @param isMatchSecond 是否匹配秒,{@link false}则秒返回-1
+ * @return 字段值列表
+ * @since 5.8.0
+ */
+ static int[] getFields(LocalDateTime dateTime, boolean isMatchSecond) {
+ final int second = isMatchSecond ? dateTime.getSecond() : -1;
+ final int minute = dateTime.getMinute();
+ final int hour = dateTime.getHour();
+ final int dayOfMonth = dateTime.getDayOfMonth();
+ final int month = dateTime.getMonthValue();// 月份从1开始
+ final int dayOfWeek = Week.of(dateTime.getDayOfWeek()).getValue() - 1; // 星期从0开始,0和7都表示周日
+ final int year = dateTime.getYear();
+ return new int[]{second, minute, hour, dayOfMonth, month, dayOfWeek, year};
+ }
+
/**
* 获取处理后的字段列表
* 月份从1开始,周从0开始
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 908154e9b..bfc5712a1 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
@@ -72,6 +72,17 @@ public class PatternMatcher {
return match(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6]);
}
+ /**
+ * 给定周的值是否匹配定时任务表达式对应部分
+ *
+ * @param dayOfWeekValue dayOfMonth值,星期从0开始,0和7都表示周日
+ * @return 如果匹配返回 {@code true}, 否则返回 {@code false}
+ * @since 5.8.0
+ */
+ public boolean matchWeek(int dayOfWeekValue) {
+ return matchers[5].match(dayOfWeekValue);
+ }
+
/**
* 给定时间是否匹配定时任务表达式
*
@@ -88,7 +99,7 @@ public class PatternMatcher {
return ((second < 0) || matchers[0].match(second)) // 匹配秒(非秒匹配模式下始终返回true)
&& matchers[1].match(minute)// 匹配分
&& matchers[2].match(hour)// 匹配时
- && isMatchDayOfMonth(matchers[3], dayOfMonth, month, Year.isLeap(year))// 匹配日
+ && matchDayOfMonth(matchers[3], dayOfMonth, month, Year.isLeap(year))// 匹配日
&& matchers[4].match(month) // 匹配月
&& matchers[5].match(dayOfWeek)// 匹配周
&& matchers[6].match(year);// 匹配年
@@ -103,7 +114,7 @@ public class PatternMatcher {
* @param isLeapYear 是否闰年
* @return 是否匹配
*/
- private static boolean isMatchDayOfMonth(PartMatcher matcher, int dayOfMonth, int month, boolean isLeapYear) {
+ private static boolean matchDayOfMonth(PartMatcher matcher, int dayOfMonth, int month, boolean isLeapYear) {
return ((matcher instanceof DayOfMonthMatcher) //
? ((DayOfMonthMatcher) matcher).match(dayOfMonth, month, isLeapYear) //
: matcher.match(dayOfMonth));