CronCheckUtil.java 1.69 KB
package cn.fw.freya.utils;

import org.springframework.scheduling.support.CronExpression;

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表达式执行时间校验工具类
 */
public class CronCheckUtil {
    /**
     * 根据cron表达式, 获取在某个时间点之后的counter次执行时间列表
     *
     * @param cronExpression cron表达式
     * @param startDate      任务开始的时间
     * @param counter        执行次数
     * @return
     */
    public static List<LocalDateTime> getRuntimeList(String cronExpression, LocalDateTime startDate, int counter) {
        final int cnt = Math.max(counter, 1);
        ArrayList<LocalDateTime> timeList = new ArrayList<LocalDateTime>(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;
    }

    /**
     * 测试cron表达式以后的执行时间
     *
     * @param args
     */
    public static void main(String[] args) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        final List<LocalDateTime> runtimeList = CronCheckUtil.getRuntimeList("0 15 0 * * ?", LocalDateTime.now(), 10);
        runtimeList.forEach(item -> System.out.println(dateTimeFormatter.format(item)));
    }
}