我试着每3个月(每季度)在Quartz上调用一次。. NET(同时使用稳定版和最新的beta版,结果相同)。
我创建了cron触发器,0 30 8 3 */3 ? *
每3个月在它发生的那个月的第3个月的上午8:30调用一次。
所以从技术上讲,今天是9月2日,我预计它明天会触发。但是下一次运行时间显示为下个月。为什么会这样呢?
更新:根据我得到的答案,我创建了以下方法-可能对某人有用:
public static string CalculateMonthsWithInterval(int startMonth, int interval)
{
var months = new List<string>();
var monthNames = new [] {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
var monthSelector = startMonth % interval;
for (var i = 0; i < 12; i++)
{
if (i % interval == monthSelector)
{
months.Add(monthNames[i]);
}
}
return string.Join(",", months.ToArray());
}
Ps:由于某些原因,我几个月没有使用索引,因为它在我的Quartz (v2 BETA)上不能很好地工作。也更容易在DB级别阅读。
示例调用—每3个月基于startDate:
var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3);
嗯,我认为这是因为调度程序将验证哪个月可以除以3,因为Quartz中的所有月份都是以0为基础的(根据:http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06),将被调度的月份将是一月,四月,七月和十月。
0 mod 3 = 0 -> JAN
1 mod 3 = 1 -> FEB
...
8 mod 3 = 2 -> SEP
9 mod 3 = 0 -> OCT
Quartz调度器将分析你的cron表达式,并只保留那些模数3等于0的表达式。
如果你想让它在那之前的一个月(三月,六月,九月和十月),你必须设置它:
0 30 8 3 MAR,JUN,SEP,DEC ? *
创建cron表达式的好页面:http://www.cronmaker.com/
Cron格式:
0 0 12 1 1/3 ? *
每个执行:
1. Saturday, April 1, 2017 12:00 PM
2. Saturday, July 1, 2017 12:00 PM
3. Sunday, October 1, 2017 12:00 PM
4. Monday, January 1, 2018 12:00 PM
5. Sunday, April 1, 2018 12:00 PM