|  | @ -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();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | }
 |