Commit 1501514857255d2ffc3ac58bad671b3d88218db6
1 parent
7ae97ee4
2022年5月27日15:07:24 cron表达式执行时间计算
Showing
1 changed file
with
19 additions
and
17 deletions
src/main/java/cn/fw/freya/utils/CronCheckUtil.java
1 | package cn.fw.freya.utils; | 1 | package cn.fw.freya.utils; |
2 | 2 | ||
3 | -import org.springframework.scheduling.support.CronSequenceGenerator; | 3 | +import org.springframework.scheduling.support.CronExpression; |
4 | 4 | ||
5 | -import java.text.SimpleDateFormat; | ||
6 | -import java.util.*; | 5 | +import java.time.LocalDateTime; |
6 | +import java.time.format.DateTimeFormatter; | ||
7 | +import java.util.ArrayList; | ||
8 | +import java.util.List; | ||
9 | +import java.util.Objects; | ||
7 | 10 | ||
8 | /** | 11 | /** |
9 | * @author wmy3969 | 12 | * @author wmy3969 |
10 | * @version 1.0 | 13 | * @version 1.0 |
11 | * @date 2021/10/05 17:30 | 14 | * @date 2021/10/05 17:30 |
12 | - * @Description cron表达式校验工具类 | 15 | + * @Description cron表达式执行时间校验工具类 |
13 | */ | 16 | */ |
14 | public class CronCheckUtil { | 17 | public class CronCheckUtil { |
15 | - | ||
16 | /** | 18 | /** |
17 | * 根据cron表达式, 获取在某个时间点之后的counter次执行时间列表 | 19 | * 根据cron表达式, 获取在某个时间点之后的counter次执行时间列表 |
18 | * | 20 | * |
@@ -21,15 +23,15 @@ public class CronCheckUtil { | @@ -21,15 +23,15 @@ public class CronCheckUtil { | ||
21 | * @param counter 执行次数 | 23 | * @param counter 执行次数 |
22 | * @return | 24 | * @return |
23 | */ | 25 | */ |
24 | - public static List<Date> getRuntimeList(String cronExpression, Date startDate, int counter) { | ||
25 | - List<Date> timeList = new ArrayList(counter); | ||
26 | - Calendar calendar = new GregorianCalendar(); | ||
27 | - TimeZone timeZone = calendar.getTimeZone(); | ||
28 | - CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cronExpression, timeZone); | ||
29 | - Date next = cronSequenceGenerator.next(startDate); | ||
30 | - for (int i = 0; i < counter; i++) { | ||
31 | - timeList.add(next); | ||
32 | - next = cronSequenceGenerator.next(next); | 26 | + public static List<LocalDateTime> getRuntimeList(String cronExpression, LocalDateTime startDate, int counter) { |
27 | + final int cnt = Math.max(counter, 1); | ||
28 | + ArrayList<LocalDateTime> timeList = new ArrayList<LocalDateTime>(cnt); | ||
29 | + CronExpression expression = CronExpression.parse(cronExpression); | ||
30 | + LocalDateTime nextTime = Objects.isNull(startDate) ? LocalDateTime.now() : startDate; | ||
31 | + for (int i = 0; i < cnt; i++) { | ||
32 | + assert nextTime != null; | ||
33 | + nextTime = expression.next(nextTime); | ||
34 | + timeList.add(nextTime); | ||
33 | } | 35 | } |
34 | return timeList; | 36 | return timeList; |
35 | } | 37 | } |
@@ -40,8 +42,8 @@ public class CronCheckUtil { | @@ -40,8 +42,8 @@ public class CronCheckUtil { | ||
40 | * @param args | 42 | * @param args |
41 | */ | 43 | */ |
42 | public static void main(String[] args) { | 44 | public static void main(String[] args) { |
43 | - final List<Date> runtimeList = CronCheckUtil.getRuntimeList("0 0/2 * * * ?", new Date(), 300); | ||
44 | - final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss mmm"); | ||
45 | - runtimeList.forEach(item -> System.out.println(sdf.format(item))); | 45 | + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
46 | + final List<LocalDateTime> runtimeList = CronCheckUtil.getRuntimeList("0 0/2 * * * ?", LocalDateTime.now(), 10); | ||
47 | + runtimeList.forEach(item -> System.out.println(dateTimeFormatter.format(item))); | ||
46 | } | 48 | } |
47 | } | 49 | } |