使用场景
使用quartz做为后台任务调度框架,cron表达式设置时间,需要根据cron表达式计算出最近n次的执行具体时间--这个通常在开放给用户修改任务执行时间给出提示时非常有用
解决:
使用quartz的jar包中提供的TriggerUtils类来计算
1、先根据corn算出执行时间
例如:获取着一个月内 每天早上10:15触发的日期
import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
* Created by chengxumiao on 2017/9/12.
public class DatesSimple {
public static void main(String[] args) {
try {
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
// 每天早上10:15触发
cronTriggerImpl.setCronExpression("0 15 10 * * ?");
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.MONTH, 1);//把统计的区间段设置为从现在到1月后的今天(主要是为了方法通用考虑)
// 这里的时间是根据corn表达式算出来的值
List<Date> dates = TriggerUtils.computeFireTimesBetween(cronTriggerImpl, null, now, calendar.getTime());
System.out.println(dates.size());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dates.forEach(date -> {
System.out.println(dateFormat.format(date));
} catch (Exception e) {
e.printStackTrace();
}
结果
30
2017-09-13 10:15:00
2017-09-14 10:15:00
2017-09-15 10:15:00
2017-09-16 10:15:00
2017-09-17 10:15:00
2017-09-18 10:15:00
2017-09-19 10:15:00
2017-09-20 10:15:00
2017-09-21 10:15:00
2017-09-22 10:15:00
2017-09-23 10:15:00
2017-09-24 10:15:00
2017-09-25 10:15:00
2017-09-26 10:15:00
2017-09-27 10:15:00
2017-09-28 10:15:00
2017-09-29 10:15:00
2017-09-30 10:15:00
2017-10-01 10:15:00
2017-10-02 10:15:00
2017-10-03 10:15:00
2017-10-04 10:15:00
2017-10-05 10:15:00
2017-10-06 10:15:00
2017-10-07 10:15:00
2017-10-08 10:15:00
2017-10-09 10:15:00
2017-10-10 10:15:00
2017-10-11 10:15:00
2017-10-12 10:15:00
2、然后加上一层for循环,就可以得到指定个数的执行日期了
for (int i = 0; i < dates.size(); i++) {
if (i >= 10) { //这个是提示的日期个数
break;
System.out.println(dateFormat.format(dates.get(i)));
}
这种方式还可以再进行优化,使用Calendar方式,直接指定日期
完整代码
public static void main(String[] args) {
try {
CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
// 每天早上10:15触发
cronTriggerImpl.setCronExpression("0 15 10 * * ?");
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.add(Calendar.MONTH, 1);//把统计的区间段设置为从现在到1月后的今天(主要是为了方法通用考虑)
// 这里的时间是根据corn表达式算出来的值
List<Date> dates = TriggerUtils.computeFireTimesBetween(cronTriggerImpl, null, now, calendar.getTime());
System.out.println(dates.size());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < dates.size(); i++) {
if (i >= 10) { //这个是提示的日期个数
break;
System.out.println(dateFormat.format(dates.get(i)));
} catch (Exception e) {
e.printStackTrace();
}
可以根据corn表达式和Calendar指定任意时间段的执行时间。这里只是起到点化作用
未经允许请勿转载:
程序喵
»
Quartz 定时任务使用 —— Cron表达式计算最近几次执行时间(十)
Quartz 定时任务使用 —— Quartz Job Scheduler经典案例(十七)
Quartz 定时任务使用 —— quartz.properties的配置(十六)
Quartz 定时任务使用 —— 数据库各表字段的含义(十五)
Quartz 定时任务使用 —— 定时任务持久化到数据库(十四)
Quartz 定时任务使用 —— JobListener、Triggerlistener、SchedulerListener(十三)
Quartz 定时任务使用 —— 探究DateBuilder用法(十二)
Quartz 定时任务使用 —— 排除指定节假日时间执行任务(十一)
Quartz 定时任务使用 —— Trigger介绍(十二)