2013-09-29 2 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:00 UTC, как я говорю?

Edit: Это безумие, он даже делает это с графиком 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 для 4.0 (2.2.400.0) – PMac

+0

Согласно в этом вопросе была ошибка в GetFireTimeAfter(), которая использовала местное время для создания дат триггера. Это похоже на то поведение, которое я вижу. В этом вопросе упоминается исправление в Quartz.Net 2.1, но я запускаю 2.2, так что это может быть новая вариация на эту ошибку (или я мог бы что-то сделать не так). – 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();

Смежные вопросы