2013-09-29 57 views
5

我想在每天早上8點,UTC時間開始工作。問題是觸發器不尊重我告訴它的時間。Quartz.net在UTC時間創建每日時間表

我的代碼如下:

ITrigger trigger = TriggerBuilder.Create() 
     .WithDailyTimeIntervalSchedule(
      s => s.WithIntervalInHours(24) 
       .OnEveryDay() 
       .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8,0))) 
     .Build(); 

    var times = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, 10); 

    foreach (var time in times) 
     Console.WriteLine(time.UtcDateTime); 

輸出是:

30/09/2013 10:00:00 PM 
1/10/2013 10:00:00 PM 
2/10/2013 10:00:00 PM 
3/10/2013 10:00:00 PM 
4/10/2013 10:00:00 PM 
5/10/2013 10:00:00 PM 
6/10/2013 9:00:00 PM 
7/10/2013 9:00:00 PM 
8/10/2013 9:00:00 PM 
9/10/2013 9:00:00 PM 

之所以在6小時的變化是夏令時這裏本週末開始。

我怎麼才能在上午8點鐘就觸發,就像我告訴它的那樣?

編輯:這是瘋狂的,它甚至使用cron時間表做的:

ITrigger trigger = TriggerBuilder.Create() 
    .WithCronSchedule("0 0 8 * * ?") 
    .Build(); 

var times = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, 10); 

foreach (var time in times) 
    Console.WriteLine(time.UtcDateTime); 

輸出:

30/09/2013 10:00:00 PM 
1/10/2013 10:00:00 PM 
2/10/2013 10:00:00 PM 
3/10/2013 10:00:00 PM 
4/10/2013 10:00:00 PM 
5/10/2013 9:00:00 PM 
6/10/2013 9:00:00 PM 
7/10/2013 9:00:00 PM 
8/10/2013 9:00:00 PM 
9/10/2013 9:00:00 PM 
+0

哪個quartz.net的版本您使用的?也許這篇文章與你的問題有關? http://stackoverflow.com/questions/15661268/quartz-net-using-understanding-cron-based-trigger-and-time-zone-summertime-da –

+0

Quartz.Net 2.2 for 4.0(2.2.400.0) – PMac

+0

根據該問題在GetFireTimeAfter()中存在一個使用本地時間創建觸發日期的錯誤。這似乎是我看到的行爲。這個問題在Quartz.Net 2.1中提到了一個修復,但是我運行的是2.2,所以它可能是這個bug的新變體(或者我可能做錯了什麼)。 – PMac

回答

15

拉下的源代碼,並通過挖掘後,我發現一個幾個解決方案。

我本來找到了解決方法,像這樣:

var trigger4 = new DailyTimeIntervalTriggerImpl 
{ 
    StartTimeUtc = DateTime.UtcNow, 
    StartTimeOfDay = new TimeOfDay(8, 0, 0), 
    RepeatIntervalUnit = IntervalUnit.Hour, 
    RepeatInterval = 24, 
    TimeZone = TimeZoneInfo.Utc 
}; 

...這使我調整我的原代碼:

ITrigger trigger2 = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule(
     s => s.WithIntervalInHours(24) 
      .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0)) 
      .InTimeZone(TimeZoneInfo.Utc)) 
    .Build(); 

這兩個給我我後。我只是希望這個庫有一些體面的文檔。

1

雖然這是舊的,我仍然會在這裏回答。你可以簡單地進行操作:

ITrigger trigger = TriggerBuilder.Create() .WithCronSchedule("0 0 8 * * ?", cron => { cron.InTimeZone(TimeZoneInfo.Utc); }) .Build();