Quartz.Net - 每3个月一次

Luk*_*uke 5 c# scheduling quartz.net

我试图在Quartz.NET中每3个月(每季度)调用一次(使用稳定版和最新版本2,测试结果相同).

我创建了cron触发器,0 30 8 3 */3 ? *每月3点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());
        }
Run Code Online (Sandbox Code Playgroud)

Ps:我几个月没有使用索引,因为由于某些原因它与我的Quartz(v2 BETA)不兼容.此外,它在数据库级别更容易阅读.

示例调用 - 基于startDate的每3个月:

var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3);
Run Code Online (Sandbox Code Playgroud)

Pie*_*gny 8

好吧,我认为这是因为调度程序将验证哪个月可以除以3,因为Quartz中的所有月都是0(根据:http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06),将安排的月份将是1月,4月,7月和10月.

0 mod 3 = 0 -> JAN
1 mod 3 = 1 -> FEB
...
8 mod 3 = 2 -> SEP
9 mod 3 = 0 -> OCT
Run Code Online (Sandbox Code Playgroud)

Quartz调度程序将分析您的cron表达式,并仅保留其模数3等于0的那些表达式.

如果你希望它在1个月之前(3月,6月,9月和10月)你将必须设置为:

0 30 8 3 MAR,JUN,SEP,DEC ? *


gem*_*423 5

创建cron表达式的好页面:http://www.cronmaker.com/

Cron格式:

0 0 12 1 1/3 ? *
Run Code Online (Sandbox Code Playgroud)

执行每一个:

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
Run Code Online (Sandbox Code Playgroud)