Commit 1501514857255d2ffc3ac58bad671b3d88218db6

Authored by 王明元
1 parent 7ae97ee4

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

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 }