2013-09-29 18 views
5

Próbuję strzelać z pracy każdego ranka o 8:00 czasu UTC. Problem polega na tym, że wyzwalacze nie respektują czasu, który im opowiadam.Quartz.net Twórz codzienny harmonogram w czasie UTC

Mój kod wygląda następująco:

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

Wyjście jest:

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 

Powodem zmiany godziny na 6 jest to, że czas letni zaczyna się tutaj w ten weekend.

W jaki sposób mogę go uruchomić po 8:00 czasu UTC, tak jak mówię?

Edit: To szaleństwo, to jeszcze robi to z harmonogramem 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); 

wyjściowa:

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

Którą wersję quartz.net używasz? Może ten wpis jest związany z Twoim problemem? 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

Według to pytanie zawierało błąd w GetFireTimeAfter(), który wykorzystywał czas lokalny do tworzenia dat wyzwalaczy. To wydaje się być zachowanie, które widzę. To pytanie wspomina o poprawce w Quartz.Net 2.1, ale używam wersji 2.2, więc może to być nowa wersja tego błędu (lub mógłbym coś zrobić źle). – PMac

Odpowiedz

15

Po zburzeniu kod źródłowy i kopanie przez, Znalazłem kilka rozwiązań.

pierwotnie znalazł rozwiązanie tak:

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

... co doprowadziło mnie do dostosowania mój oryginalny kod:

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

Oba te dają mi co mam po. Chciałbym mieć przyzwoitą dokumentację dla tej biblioteki.

1

Chociaż to jest stare, ja i tak tu odpowiem. Możesz po prostu wykonać operację:

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