From 1501514857255d2ffc3ac58bad671b3d88218db6 Mon Sep 17 00:00:00 2001 From: 王明元 <97082371@qq.com> Date: Fri, 27 May 2022 15:08:04 +0800 Subject: [PATCH] 2022年5月27日15:07:24 cron表达式执行时间计算 --- src/main/java/cn/fw/freya/utils/CronCheckUtil.java | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/cn/fw/freya/utils/CronCheckUtil.java b/src/main/java/cn/fw/freya/utils/CronCheckUtil.java index 52c85fb..ad6d9da 100644 --- a/src/main/java/cn/fw/freya/utils/CronCheckUtil.java +++ b/src/main/java/cn/fw/freya/utils/CronCheckUtil.java @@ -1,18 +1,20 @@ package cn.fw.freya.utils; -import org.springframework.scheduling.support.CronSequenceGenerator; +import org.springframework.scheduling.support.CronExpression; -import java.text.SimpleDateFormat; -import java.util.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; /** * @author wmy3969 * @version 1.0 * @date 2021/10/05 17:30 - * @Description cron表达式校验工具类 + * @Description cron表达式执行时间校验工具类 */ public class CronCheckUtil { - /** * 根据cron表达式, 获取在某个时间点之后的counter次执行时间列表 * @@ -21,15 +23,15 @@ public class CronCheckUtil { * @param counter 执行次数 * @return */ - public static List getRuntimeList(String cronExpression, Date startDate, int counter) { - List timeList = new ArrayList(counter); - Calendar calendar = new GregorianCalendar(); - TimeZone timeZone = calendar.getTimeZone(); - CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cronExpression, timeZone); - Date next = cronSequenceGenerator.next(startDate); - for (int i = 0; i < counter; i++) { - timeList.add(next); - next = cronSequenceGenerator.next(next); + public static List getRuntimeList(String cronExpression, LocalDateTime startDate, int counter) { + final int cnt = Math.max(counter, 1); + ArrayList timeList = new ArrayList(cnt); + CronExpression expression = CronExpression.parse(cronExpression); + LocalDateTime nextTime = Objects.isNull(startDate) ? LocalDateTime.now() : startDate; + for (int i = 0; i < cnt; i++) { + assert nextTime != null; + nextTime = expression.next(nextTime); + timeList.add(nextTime); } return timeList; } @@ -40,8 +42,8 @@ public class CronCheckUtil { * @param args */ public static void main(String[] args) { - final List runtimeList = CronCheckUtil.getRuntimeList("0 0/2 * * * ?", new Date(), 300); - final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss mmm"); - runtimeList.forEach(item -> System.out.println(sdf.format(item))); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + final List runtimeList = CronCheckUtil.getRuntimeList("0 0/2 * * * ?", LocalDateTime.now(), 10); + runtimeList.forEach(item -> System.out.println(dateTimeFormatter.format(item))); } } -- libgit2 0.22.2