|
@ -0,0 +1,57 @@
|
|
|
package com.yihu.jw.cron;
|
|
|
|
|
|
import com.cronutils.model.Cron;
|
|
|
import com.cronutils.model.CronType;
|
|
|
import com.cronutils.model.definition.CronDefinitionBuilder;
|
|
|
import com.cronutils.model.time.ExecutionTime;
|
|
|
import com.cronutils.parser.CronParser;
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.ZonedDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* cron表达式工具类
|
|
|
* Created by yeshijie on 2023/10/28.
|
|
|
*/
|
|
|
public class CronUtils {
|
|
|
|
|
|
/**
|
|
|
* 根据cron表达式解析最近几次的执行时间
|
|
|
* @param cronStr
|
|
|
* @param num
|
|
|
* @return
|
|
|
*/
|
|
|
public static List<String> getExecutionTimeByNum(String cronStr, Integer num, LocalDateTime localDateTime) {
|
|
|
CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.SPRING));
|
|
|
Cron cron = parser.parse(cronStr);
|
|
|
ExecutionTime time = ExecutionTime.forCron(cron);
|
|
|
ZonedDateTime now;
|
|
|
if(localDateTime == null){
|
|
|
now = ZonedDateTime.now();
|
|
|
}else {
|
|
|
now = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
|
|
|
}
|
|
|
ZonedDateTime next = getNext(time, now);
|
|
|
List<ZonedDateTime> timeList = new ArrayList<>(num);
|
|
|
timeList.add(next);
|
|
|
for (int i = 1; i < num; i++) {
|
|
|
next = getNext(time, next);
|
|
|
timeList.add(next);
|
|
|
}
|
|
|
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
List<String> resultList = new ArrayList<>(num);
|
|
|
for (ZonedDateTime item : timeList) {
|
|
|
String result = item.format(format);
|
|
|
resultList.add(result);
|
|
|
}
|
|
|
return resultList;
|
|
|
}
|
|
|
|
|
|
private static ZonedDateTime getNext(ExecutionTime time, ZonedDateTime current) {
|
|
|
return time.nextExecution(current).get();
|
|
|
}
|
|
|
}
|