quartz.CronExpression计算未来执行时间

阅读更多

 

 

import org.joda.time.DateTime;
import org.quartz.CronExpression;

import com.google.common.collect.Lists;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * CronExpressionUtils.java
 * 
 * @author kanpiaoxue
 * @version 1.0
 *          Create Time 2018年11月18日 下午10:15:41
 *          Description : spring的cron表达式工具类
 */
public class CronExpressionUtils {
    /**
     * 计算在[startDate,endDate]区间之间满足crontab表达式的时间列表
     * 
     * @param crontab
     *            :spring cronExpression
     * @param startDate
     *            :左闭区间
     * @param endDate
     *            : 右闭区间
     * @return 在[startDate,endDate]区间之间满足crontab表达式的时间列表
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static List getMatchedTimes(String crontab, Date startDate, Date endDate) {
        try {
            CronExpression cronExpression = new CronExpression(crontab);
            List matchedTimes = Lists.newArrayList();
            Date beginTime = new DateTime(startDate).plusMillis(-1).toDate();
            Date currentDate = cronExpression.getNextValidTimeAfter(beginTime);
            while (!currentDate.after(endDate)) {
                matchedTimes.add(currentDate);
                currentDate = cronExpression.getNextValidTimeAfter(currentDate);
            }
            return matchedTimes;
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid crontab " + crontab, e);
        }
    }

    /**
     * 计算startDate时间后符合crontab表达式的时间
     * 
     * @param crontab
     *            : spring cronExpression
     * @param startDate
     *            : 开始时间
     * @return startDate时间后符合crontab表达式的时间
     * @throws ParseException
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static Date getNext(String crontab, Date startDate) {
        try {
            CronExpression cronExpression = new CronExpression(crontab);
            return cronExpression.getNextValidTimeAfter(startDate);
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid crontab " + crontab, e);
        }
    }

    /**
     * 判断cronExpression是否是个有效的表达式
     * 
     * @param crontab
     *            : spring cronExpression
     * @return cronExpression是否是个有效的表达式
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static boolean isValidExpression(String crontab) {
        return CronExpression.isValidExpression(crontab);
    }
}

 

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.google.common.base.Preconditions;

/**
 * DateUtils.java
 *
 * @author kanpiaoxue
 * @version 1.0
 *          Create Time 2018年11月18日 下午4:31:33
 *          Description : 时间工具类
 */
public class DateUtils {

    public static final DateTimeFormatter yyyy_MM_dd = DateTimeFormat.forPattern("yyyy-MM-dd");
    public static final DateTimeFormatter yyyy_MM_dd_HH_mm_ss = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter yyyy_MM_dd_HH_mm_ss_SSS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");

    /**
     * @param dateTime
     * @return
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午4:41:42
     *         Description : 修正当前时间为日期的零点时间,如:2018-11-18 23:59:59.999
     */
    public static DateTime correctDayEndTime(DateTime dateTime) {
        Preconditions.checkNotNull(dateTime, "dateTime is null");
        DateTime rs = new DateTime(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth(),
                23, 59, 59, 999);
        return rs;
    }

    /**
     * @param dateTime
     * @return
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午4:41:45
     *         Description : 修正当前时间为日期的零点时间,如:2018-11-18 00:00:00.000
     */
    public static DateTime correctDayStartTime(DateTime dateTime) {
        Preconditions.checkNotNull(dateTime, "dateTime is null");
        DateTime rs = new DateTime(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth(), 0,
                0, 0, 0);
        return rs;
    }

    /**
     * @return 明天的时间
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午5:24:56
     *         Description : 得到明天的时间
     */
    public static DateTime getTomorrow() {
        return DateTime.now().dayOfMonth().addToCopy(1);
    }

    private DateUtils() {
        super();
    }
}

 

 

    public static void main(String[] args) throws Exception {
        DateTime now = DateTime.now();
        DateTime startDate = DateUtils.correctDayStartTime(now);
        DateTime endDate = DateUtils.correctDayEndTime(now);
        // 每天,间隔5分钟运行一次
        List dates =
                CronExpressionUtils.getMatchedTimes("0 0/5 * * * ?", startDate.toDate(), endDate.toDate());

        System.out.println(dates.size());
        System.out.println("startDate:" + startDate.toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        System.out.println("endDate:" + endDate.toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        dates.stream().forEach(date -> {
            System.out.println(new DateTime(date).toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        });
    }

 

 

 

 

output:

 

288

startDate:2018-11-18 00:00:00

endDate:2018-11-18 23:59:59

2018-11-18 00:00:00

2018-11-18 00:05:00

2018-11-18 00:10:00

2018-11-18 00:15:00

2018-11-18 00:20:00

2018-11-18 00:25:00

2018-11-18 00:30:00

2018-11-18 00:35:00

2018-11-18 00:40:00

2018-11-18 00:45:00

2018-11-18 00:50:00

2018-11-18 00:55:00

2018-11-18 01:00:00

2018-11-18 01:05:00

2018-11-18 01:10:00

2018-11-18 01:15:00

2018-11-18 01:20:00

2018-11-18 01:25:00

2018-11-18 01:30:00

2018-11-18 01:35:00

2018-11-18 01:40:00

2018-11-18 01:45:00

2018-11-18 01:50:00

2018-11-18 01:55:00

2018-11-18 02:00:00

2018-11-18 02:05:00

2018-11-18 02:10:00

2018-11-18 02:15:00

2018-11-18 02:20:00

2018-11-18 02:25:00

2018-11-18 02:30:00

2018-11-18 02:35:00

2018-11-18 02:40:00

2018-11-18 02:45:00

2018-11-18 02:50:00

2018-11-18 02:55:00

2018-11-18 03:00:00

2018-11-18 03:05:00

2018-11-18 03:10:00

2018-11-18 03:15:00

2018-11-18 03:20:00

2018-11-18 03:25:00

2018-11-18 03:30:00

2018-11-18 03:35:00

2018-11-18 03:40:00

2018-11-18 03:45:00

2018-11-18 03:50:00

2018-11-18 03:55:00

2018-11-18 04:00:00

2018-11-18 04:05:00

2018-11-18 04:10:00

2018-11-18 04:15:00

2018-11-18 04:20:00

2018-11-18 04:25:00

2018-11-18 04:30:00

2018-11-18 04:35:00

2018-11-18 04:40:00

2018-11-18 04:45:00

2018-11-18 04:50:00

2018-11-18 04:55:00

2018-11-18 05:00:00

2018-11-18 05:05:00

2018-11-18 05:10:00

2018-11-18 05:15:00

2018-11-18 05:20:00

2018-11-18 05:25:00

2018-11-18 05:30:00

2018-11-18 05:35:00

2018-11-18 05:40:00

2018-11-18 05:45:00

2018-11-18 05:50:00

2018-11-18 05:55:00

2018-11-18 06:00:00

2018-11-18 06:05:00

2018-11-18 06:10:00

2018-11-18 06:15:00

2018-11-18 06:20:00

2018-11-18 06:25:00

2018-11-18 06:30:00

2018-11-18 06:35:00

2018-11-18 06:40:00

2018-11-18 06:45:00

2018-11-18 06:50:00

2018-11-18 06:55:00

2018-11-18 07:00:00

2018-11-18 07:05:00

2018-11-18 07:10:00

2018-11-18 07:15:00

2018-11-18 07:20:00

2018-11-18 07:25:00

2018-11-18 07:30:00

2018-11-18 07:35:00

2018-11-18 07:40:00

2018-11-18 07:45:00

2018-11-18 07:50:00

2018-11-18 07:55:00

2018-11-18 08:00:00

2018-11-18 08:05:00

2018-11-18 08:10:00

2018-11-18 08:15:00

2018-11-18 08:20:00

2018-11-18 08:25:00

2018-11-18 08:30:00

2018-11-18 08:35:00

2018-11-18 08:40:00

2018-11-18 08:45:00

2018-11-18 08:50:00

2018-11-18 08:55:00

2018-11-18 09:00:00

2018-11-18 09:05:00

2018-11-18 09:10:00

2018-11-18 09:15:00

2018-11-18 09:20:00

2018-11-18 09:25:00

2018-11-18 09:30:00

2018-11-18 09:35:00

2018-11-18 09:40:00

2018-11-18 09:45:00

2018-11-18 09:50:00

2018-11-18 09:55:00

2018-11-18 10:00:00

2018-11-18 10:05:00

2018-11-18 10:10:00

2018-11-18 10:15:00

2018-11-18 10:20:00

2018-11-18 10:25:00

2018-11-18 10:30:00

2018-11-18 10:35:00

2018-11-18 10:40:00

2018-11-18 10:45:00

2018-11-18 10:50:00

2018-11-18 10:55:00

2018-11-18 11:00:00

2018-11-18 11:05:00

2018-11-18 11:10:00

2018-11-18 11:15:00

2018-11-18 11:20:00

2018-11-18 11:25:00

2018-11-18 11:30:00

2018-11-18 11:35:00

2018-11-18 11:40:00

2018-11-18 11:45:00

2018-11-18 11:50:00

2018-11-18 11:55:00

2018-11-18 12:00:00

2018-11-18 12:05:00

2018-11-18 12:10:00

2018-11-18 12:15:00

2018-11-18 12:20:00

2018-11-18 12:25:00

2018-11-18 12:30:00

2018-11-18 12:35:00

2018-11-18 12:40:00

2018-11-18 12:45:00

2018-11-18 12:50:00

2018-11-18 12:55:00

2018-11-18 13:00:00

2018-11-18 13:05:00

2018-11-18 13:10:00

2018-11-18 13:15:00

2018-11-18 13:20:00

2018-11-18 13:25:00

2018-11-18 13:30:00

2018-11-18 13:35:00

2018-11-18 13:40:00

2018-11-18 13:45:00

2018-11-18 13:50:00

2018-11-18 13:55:00

2018-11-18 14:00:00

2018-11-18 14:05:00

2018-11-18 14:10:00

2018-11-18 14:15:00

2018-11-18 14:20:00

2018-11-18 14:25:00

2018-11-18 14:30:00

2018-11-18 14:35:00

2018-11-18 14:40:00

2018-11-18 14:45:00

2018-11-18 14:50:00

2018-11-18 14:55:00

2018-11-18 15:00:00

2018-11-18 15:05:00

2018-11-18 15:10:00

2018-11-18 15:15:00

2018-11-18 15:20:00

2018-11-18 15:25:00

2018-11-18 15:30:00

2018-11-18 15:35:00

2018-11-18 15:40:00

2018-11-18 15:45:00

2018-11-18 15:50:00

2018-11-18 15:55:00

2018-11-18 16:00:00

2018-11-18 16:05:00

2018-11-18 16:10:00

2018-11-18 16:15:00

2018-11-18 16:20:00

2018-11-18 16:25:00

2018-11-18 16:30:00

2018-11-18 16:35:00

2018-11-18 16:40:00

2018-11-18 16:45:00

2018-11-18 16:50:00

2018-11-18 16:55:00

2018-11-18 17:00:00

2018-11-18 17:05:00

2018-11-18 17:10:00

2018-11-18 17:15:00

2018-11-18 17:20:00

2018-11-18 17:25:00

2018-11-18 17:30:00

2018-11-18 17:35:00

2018-11-18 17:40:00

2018-11-18 17:45:00

2018-11-18 17:50:00

2018-11-18 17:55:00

2018-11-18 18:00:00

2018-11-18 18:05:00

2018-11-18 18:10:00

2018-11-18 18:15:00

2018-11-18 18:20:00

2018-11-18 18:25:00

2018-11-18 18:30:00

2018-11-18 18:35:00

2018-11-18 18:40:00

2018-11-18 18:45:00

2018-11-18 18:50:00

2018-11-18 18:55:00

2018-11-18 19:00:00

2018-11-18 19:05:00

2018-11-18 19:10:00

2018-11-18 19:15:00

2018-11-18 19:20:00

2018-11-18 19:25:00

2018-11-18 19:30:00

2018-11-18 19:35:00

2018-11-18 19:40:00

2018-11-18 19:45:00

2018-11-18 19:50:00

2018-11-18 19:55:00

2018-11-18 20:00:00

2018-11-18 20:05:00

2018-11-18 20:10:00

2018-11-18 20:15:00

2018-11-18 20:20:00

2018-11-18 20:25:00

2018-11-18 20:30:00

2018-11-18 20:35:00

2018-11-18 20:40:00

2018-11-18 20:45:00

2018-11-18 20:50:00

2018-11-18 20:55:00

2018-11-18 21:00:00

2018-11-18 21:05:00

2018-11-18 21:10:00

2018-11-18 21:15:00

2018-11-18 21:20:00

2018-11-18 21:25:00

2018-11-18 21:30:00

2018-11-18 21:35:00

2018-11-18 21:40:00

2018-11-18 21:45:00

2018-11-18 21:50:00

2018-11-18 21:55:00

2018-11-18 22:00:00

2018-11-18 22:05:00

2018-11-18 22:10:00

2018-11-18 22:15:00

2018-11-18 22:20:00

2018-11-18 22:25:00

2018-11-18 22:30:00

2018-11-18 22:35:00

2018-11-18 22:40:00

2018-11-18 22:45:00

2018-11-18 22:50:00

2018-11-18 22:55:00

2018-11-18 23:00:00

2018-11-18 23:05:00

2018-11-18 23:10:00

2018-11-18 23:15:00

2018-11-18 23:20:00

2018-11-18 23:25:00

2018-11-18 23:30:00

2018-11-18 23:35:00

2018-11-18 23:40:00

2018-11-18 23:45:00

2018-11-18 23:50:00

2018-11-18 23:55:00

 

你可能感兴趣的:(quartz.CronExpression计算未来执行时间)