如何在Quartz调度器中配置C#任务于8:45-17:15每3分钟执行?
解决Quartz.NET中8:45至17:15每3分钟执行任务的Cron表达式问题
Hey there! 刚好帮你梳理出了精准的解决方案,毕竟我之前也在Quartz.NET里折腾过类似的定时任务配置😉
要实现8:45到17:15期间每3分钟执行一次的需求,直接写单个Cron表达式容易出现逻辑冲突(比如会包含8点前45分钟的无效执行时间),所以最清晰准确的方式是拆分三个触发器,分别覆盖三个时间段:
对应的Cron表达式及说明
我把每个时间段的表达式和含义都列出来:
1. 8:45 - 8:57 每3分钟执行
0 45/3 8 * * ?
- 秒位设为
0(确保整分钟执行) - 分位
45/3:从45分开始,每3分钟触发一次(对应45、48、51、54、57分) - 时位固定为
8,仅在8点生效
2. 9:00 - 16:57 每3分钟执行
0 0/3 9-16 * * ?
- 分位
0/3:从0分开始,每3分钟触发一次 - 时位
9-16:覆盖9点到16点的所有整点时段
3. 17:00 - 17:15 每3分钟执行
0 0-15/3 17 * * ?
- 分位
0-15/3:在0到15分之间,每3分钟触发一次(对应0、3、6、9、12、15分) - 时位固定为
17,仅在17点生效
C#代码配置示例
下面是在Quartz.NET中绑定Job和这三个触发器的代码片段(以3.x版本为例):
// 假设你已经定义了自己的Job类,比如MyScheduledJob var job = JobBuilder.Create<MyScheduledJob>() .WithIdentity("TimeRangeJob", "TaskGroup") .Build(); // 创建三个触发器 var morningTrigger = TriggerBuilder.Create() .WithIdentity("MorningTrigger", "TaskGroup") .WithCronSchedule("0 45/3 8 * * ?") .Build(); var middayTrigger = TriggerBuilder.Create() .WithIdentity("MiddayTrigger", "TaskGroup") .WithCronSchedule("0 0/3 9-16 * * ?") .Build(); var afternoonTrigger = TriggerBuilder.Create() .WithIdentity("AfternoonTrigger", "TaskGroup") .WithCronSchedule("0 0-15/3 17 * * ?") .Build(); // 绑定到调度器并启动 var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); await scheduler.ScheduleJob(job, new List<ITrigger> { morningTrigger, middayTrigger, afternoonTrigger }, true);
额外注意事项
- 如果需要仅在工作日执行,可以在每个表达式的最后加上
MON-FRI,比如0 45/3 8 * * MON-FRI - 确认你的Quartz.NET版本,上面的表达式在3.x及以上版本都能正常解析
- 测试时可以用Quartz自带的Cron表达式验证逻辑(或者本地调试),确保触发时间符合预期
内容的提问来源于stack exchange,提问作者user9613901




