Commit 1501514857255d2ffc3ac58bad671b3d88218db6

Authored by 王明元
1 parent 7ae97ee4

2022年5月27日15:07:24 cron表达式执行时间计算

src/main/java/cn/fw/freya/utils/CronCheckUtil.java
1 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 12 * @author wmy3969
10 13 * @version 1.0
11 14 * @date 2021/10/05 17:30
12   - * @Description cron表达式校验工具类
  15 + * @Description cron表达式执行时间校验工具类
13 16 */
14 17 public class CronCheckUtil {
15   -
16 18 /**
17 19 * 根据cron表达式, 获取在某个时间点之后的counter次执行时间列表
18 20 *
... ... @@ -21,15 +23,15 @@ public class CronCheckUtil {
21 23 * @param counter 执行次数
22 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 36 return timeList;
35 37 }
... ... @@ -40,8 +42,8 @@ public class CronCheckUtil {
40 42 * @param args
41 43 */
42 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 }
... ...