石英.净-每3个月



我试着每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

相关内容

  • 没有找到相关文章

最新更新