0

我是石英新手。

我只是想找出 Quartz.net 是否可以在给定开始日期(可能是过去)、结束日期和间隔计算正确的日期出现的情况下——它可能不是 Quartz 的主要用例,但它似乎可以从我可以从 API 中发现什么。

所以给定这个片段:

var exp = new CronExpression("0 0 0 1/7 * ? *");

    var next = exp.GetNextValidTimeAfter(new DateTime(2012, 1, 1, 12, 30, 00).ToUniversalTime());
    while (next < DateTime.Parse("30 Oct 2012"))
    {
        next = exp.GetNextValidTimeAfter(next.Value);
        System.Diagnostics.Debug.WriteLine(next);
    }

结果似乎是(截断):

2012 年 1 月 14 日上午 11:00:00 +00:00

21/01/2012 上午 11:00:00 +00:00

28/01/2012 上午 11:00:00 +00:00

2012 年 1 月 31 日上午 11:00:00 +00:00

2012 年 7 月 2 日上午 11:00:00 +00:00

14/02/2012 上午 11:00:00 +00:00

21/02/2012 上午 11:00:00 +00:00

2012 年 2 月 28 日上午 11:00:00 +00:00

2012 年 2 月 29 日上午 11:00:00 +00:00

2012 年 7 月 3 日上午 11:00:00 +00:00

Errr... 似乎 Quartz 的 CRON 表达式总是包括一个月的最后一天,并且基本上从那里计算下一个日期?还是我对石英 / cron 的期望/理解是错误的?

这些结果似乎也使用http://www.cronmaker.com/来支持...

谢谢!

4

1 回答 1

1

我不认为你不能用 cron 表达式来实现你正在寻找的东西。

如果您下载并使用Quartz.Net 2.x ,您可以使用一种称为CalendarIntervalTrigger的新型触发器,它可用于管理不同的间隔单位。

我已经测试了这段代码,它按您期望的方式工作:

DateTimeOffset startCalendar = DateBuilder.DateOf(11, 0, 0, 14, 1, 2012);

var weeklyTrigger = new CalendarIntervalTriggerImpl
{
    StartTimeUtc = startCalendar,
    RepeatIntervalUnit = IntervalUnit.Week,
    RepeatInterval = 1  // every one week;
};

IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(weeklyTrigger, null, 10);

foreach (var item in fireTimes)
{
    Console.WriteLine(item);
}
Console.ReadLine();

结果:

2012 年 1 月 14 日11:00:00 +00:00
2012 年 1 月 21 日 11:00:00 +00 :00 2012 年 1 月 28 日
11:00:00 +00:00 2012 年 4 月 2 日
11:00 :00 +00:00
11/02/2012 11:00:00 +00:00
18/02/2012 11:00:00 +00:00
25/02/2012 11:00:00 +00:00
03/ 2012年 3 月 11:00:00 +00:00 2012
年 10 月 3 日 11:00:00 +00:00 2012 年 3 月 17 日 11:00:00
+00:00

于 2012-08-29T23:13:38.787 回答