如何获取Quartz每日循环任务的最后一次调度触发时间?
解决方案
思路:借助Quartz的CronExpression计算窗口内最后触发时间
不用手动解析cron字符串,直接利用Quartz内置的时间计算API。核心步骤:
- 定位当前时间所属的每日循环窗口:每个窗口为D日19:00 至 D+1日2:59
- 确定该窗口的结束时间(即D+1日2:59)
- 通过
CronExpression的getFireTimeBefore(Date endTime)方法,获取结束时间前的最后一次有效触发时间,此即为当前循环的最终触发时间
实现代码
以下是Spring Boot环境下的工具方法示例:
import org.quartz.CronExpression; import java.text.ParseException; import java.util.Calendar; import java.util.Date; public class QuartzCycleUtils { public static Date getCurrentCycleLastFire(String cronStr) throws ParseException { CronExpression cron = new CronExpression(cronStr); Calendar nowCal = Calendar.getInstance(); int currentHour = nowCal.get(Calendar.HOUR_OF_DAY); // 计算当前循环窗口的结束时间 Calendar windowEndCal = Calendar.getInstance(); if (currentHour >= 19) { // 当前在19:00之后,窗口结束于次日2:59 windowEndCal.add(Calendar.DAY_OF_MONTH, 1); } windowEndCal.set(Calendar.HOUR_OF_DAY, 2); windowEndCal.set(Calendar.MINUTE, 59); windowEndCal.set(Calendar.SECOND, 0); windowEndCal.set(Calendar.MILLISECOND, 0); Date windowEnd = windowEndCal.getTime(); // 获取窗口结束前的最后一次触发时间 return cron.getFireTimeBefore(windowEnd); } }
额外说明
- 若当前时间处于D日2:59 至 D日19:00区间,当前所属窗口为D-1日19:00 至 D日2:59,方法会返回D日2:59这个最后触发点
- 该方法依赖Quartz的原生计算逻辑,能适配cron表达式的复杂规则(如秒级调度、特定日期限制等),比手动解析cron更可靠
- 如需获取下一个循环的开始时间:若当前在窗口内,下一个开始时间为D+1日19:00;否则为当日19:00,可基于同样的Calendar逻辑实现
内容的提问来源于stack exchange,提问作者Yashwin.L
相关产品推荐
相关产品推荐

