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

如何在APScheduler中配置工作日特定时段的间隔任务?

实现指定时段的定时任务方案

不需要结合CronTrigger与IntervalTrigger,用CronTrigger就能精准实现你的需求,以下是两种可行方案:

方案一:多CronTrigger拆分逻辑(推荐,清晰易维护)

直接创建3个CronTrigger,分别对应不同的时间区间,全部绑定到同一个任务Job上:

  1. 10:25、10:30、10:35 执行

    • Cron表达式:25,30,35 10 * * 1-5
    • 说明:限定周一到周五,仅10点的25、30、35分触发
  2. 11:00-17:55 每5分钟执行一次

    • Cron表达式:*/5 11-17 * * 1-5
    • 说明:周一到周五,11点至17点的每5分钟触发一次
  3. 18:00、18:05……18:35 执行

    • Cron表达式:0,5,10,15,20,25,30,35 18 * * 1-5
    • 说明:周一到周五,18点的0至35分每5分钟触发一次

Java + Quartz 代码示例

// 假设已定义你的任务类:YourTaskJob
JobDetail job = JobBuilder.newJob(YourTaskJob.class)
    .withIdentity("yourTaskJob", "taskGroup")
    .build();

// 第一个Trigger:10点的指定分钟
Trigger trigger1 = TriggerBuilder.newTrigger()
    .withIdentity("trigger10", "taskGroup")
    .withSchedule(CronScheduleBuilder.cronSchedule("25,30,35 10 * * 1-5"))
    .forJob(job)
    .build();

// 第二个Trigger:11-17点每5分钟
Trigger trigger2 = TriggerBuilder.newTrigger()
    .withIdentity("triggerMidday", "taskGroup")
    .withSchedule(CronScheduleBuilder.cronSchedule("*/5 11-17 * * 1-5"))
    .forJob(job)
    .build();

// 第三个Trigger:18点的指定分钟
Trigger trigger3 = TriggerBuilder.newTrigger()
    .withIdentity("trigger18", "taskGroup")
    .withSchedule(CronScheduleBuilder.cronSchedule("0,5,10,15,20,25,30,35 18 * * 1-5"))
    .forJob(job)
    .build();

// 注册任务与触发器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
scheduler.scheduleJob(job, Arrays.asList(trigger1, trigger2, trigger3), true);

方案二:单CronTrigger配合排除日历

如果想用单个Trigger,可以先覆盖大时间区间,再用日历排除不需要的时段:

  1. 基础Cron表达式:*/5 10-18 * * 1-5(周一到周五10:00-18:59每5分钟触发)
  2. 排除规则:
    • 10:00-10:20(即10点的0、5、10、15、20分)
    • 18:40-18:59(即18点的40、45、50、55分)

Java + Quartz 代码示例

JobDetail job = JobBuilder.newJob(YourTaskJob.class)
    .withIdentity("yourTaskJob", "taskGroup")
    .build();

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
Calendar baseCal = Calendar.getInstance();
baseCal.set(Calendar.SECOND, 0);
baseCal.set(Calendar.MILLISECOND, 0);

// 添加10点需排除的分钟
for (int min : new int[]{0,5,10,15,20}) {
    baseCal.set(Calendar.HOUR_OF_DAY, 10);
    baseCal.set(Calendar.MINUTE, min);
    MutableCalendar excludeCal = new MutableCalendar(baseCal);
    excludeCal.setExclusion(true);
    scheduler.addCalendar("exclude10_" + min, excludeCal, false, false);
}

// 添加18点需排除的分钟
for (int min : new int[]{40,45,50,55}) {
    baseCal.set(Calendar.HOUR_OF_DAY, 18);
    baseCal.set(Calendar.MINUTE, min);
    MutableCalendar excludeCal = new MutableCalendar(baseCal);
    excludeCal.setExclusion(true);
    scheduler.addCalendar("exclude18_" + min, excludeCal, false, false);
}

// 创建Trigger并绑定排除日历
Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("yourTaskTrigger", "taskGroup")
    .withSchedule(CronScheduleBuilder.cronSchedule("*/5 10-18 * * 1-5"))
    .modifiedByCalendar("exclude10_0,exclude10_5,exclude10_10,exclude10_15,exclude10_20,exclude18_40,exclude18_45,exclude18_50,exclude18_55")
    .forJob(job)
    .build();

scheduler.scheduleJob(job, trigger);
scheduler.start();

内容的提问来源于stack exchange,提问作者Rishabh Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:29