2012-08-29 76 views
0

我是一個新手石英。Quartz.net cron表達式總是返回月份的最後一天?

我只是試圖找出Quartz.net是否可以,給定一個開始日期(可能在過去),結束日期和間隔計算正確的日期發生 - 它可能不是Quartz的主要用例,但從我可以發現的API中看起來是可能的。

因此,考慮這個片段:

VAR EXP =新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); 
    } 

結果似乎(截斷):

14/01/2012上午11時00分00秒+00:00

21/01/2012上午11時00分00秒+00:00

28/01/2012上午十一時00分00秒+00:00

31/01/2012上午十一時00分00秒+00:00

2012年7月2日上午11點00分○○秒+00:00

14/02/2012上午11點00分○○秒+00:00

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

28/02/2012上午11時00分零零秒+00:00

29/02/2012上午11時00分零零秒+00:00

7/03/2012上午十一時00分00秒+00:00

Errr ...看來Quartz的cron表達式總是包含一個月的最後一天,基本上從那裏計算的下一個日期?或者,我對quartz/cron的期望/理解是錯誤的?

而且這些結果似乎使用http://www.cronmaker.com/備份...

謝謝!

回答

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(); 

結果:

14/01/2012 11:00:00 +00:00
21/01/2012 11:00:00 +00:00
28/01/2012 11:00:00 +00:00
04/02/2012 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/03/2012 11:00:00 00:00
10/03/2012 11:00:00 +00:00
17/03/2012 11:00:00 +00:00

+0

欣賞試圖回答這個問題的努力 - 不知道我是否應該現在將其標記作爲答案,因爲實際問題不是我們如何實現正確的結果,而是CRON是按照我們所觀察的方式工作還是按照Quartz的實施方式工作? – 6footunder

+0

對不起,上面的LeftyX,但我最好的答案(最近發現)似乎與CRON的一般行爲緊密相關 - 看起來每個單元都是「盒裝的」,因爲對於給定的單位來說,要求更好的術語。在這種情況下,你不能溢出到下一個單位(幾個月)。一個糟糕的但希望足以解釋我們看到幾個cron測試工具? – 6footunder

+0

@ 6footunder:你試圖做的事情對於一個CRON表達式來說是不可能的(即使在Unix中也是如此)http://superuser.com/questions/110911/how-can-i-create-a-cron-job -that-runs-a-task-every-three-weeks唯一可能的解決方案是創建多個cron表達式或使用上述解決方案。 – LeftyX

相關問題