You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:45:08