2012-10-04 23 views
32

Estoy tratando de construir un programa diario que se repite en Quartz.Net pero tener algunos problemas:Quartz.Net cómo crear un programa diario que no ganas 1 minuto por día

Para empezar, ya construir un diario horario, a las 12:45 repating Usando código Quartz.Net así:

var trigger = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule(s => 
     s.OnEveryDay().StartingDailyAt(new TimeOfDay(13, 00))) 
.Build(); 

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

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

esto está siendo ejecutado en Nueva Zelanda, el horario de verano (por lo GMT + 13: 00)

Y la salida que se ve es bastante extraño:

5/10/2012 1:00:00 p.m. +13:00 
5/10/2012 12:01:00 a.m. +00:00 
5/10/2012 12:02:00 a.m. +00:00 
5/10/2012 12:03:00 a.m. +00:00 
5/10/2012 12:04:00 a.m. +00:00 
5/10/2012 12:05:00 a.m. +00:00 
5/10/2012 12:06:00 a.m. +00:00 
5/10/2012 12:07:00 a.m. +00:00 
5/10/2012 12:08:00 a.m. +00:00 
5/10/2012 12:09:00 a.m. +00:00 

La primera fecha/hora se visualiza usando la zona horaria local, luego el resto se visualiza con UTC, y cada valor de tiempo se incrementa en 1 minuto, y la fecha nunca cambia.

Siento que me podría estar perdiendo algo fundamental aquí con el horario de intervalo de tiempo diario, pero simplemente no sé lo que es?

Editar

Como una actualización para hacer esto, ahora han pasado a utilizar un disparador basado expresión CRON:

TriggerBuilder.Create() 
    .WithCronSchedule(string.Format("0 {0} {1} ? * *", 0, 13)) 
    .Build(); 

y me dio los resultados que cabe esperar:

5/10/2012 12:00:00 a.m. +00:00 
6/10/2012 12:00:00 a.m. +00:00 
7/10/2012 12:00:00 a.m. +00:00 
8/10/2012 12:00:00 a.m. +00:00 
9/10/2012 12:00:00 a.m. +00:00 
10/10/2012 12:00:00 a.m. +00:00 
11/10/2012 12:00:00 a.m. +00:00 
12/10/2012 12:00:00 a.m. +00:00 
13/10/2012 12:00:00 a.m. +00:00 
14/10/2012 12:00:00 a.m. +00:00 

Pero me gustaría saber por qué el programa DailyTimeIntervale no funciona ...

+11

TriggerUtils.ComputeFireTimes - increíble! –

Respuesta

43

No especifica el intervalo predeterminado de 1 minuto, por lo que se supone que desea ejecutar el trabajo cada minuto.

Trate

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

El defecto debe ser a correr todos los días, por lo que el OnEveryDay() no es realmente necesario.

No estoy seguro de por qué está viendo local y UTC, ya que todos mis tiempos se muestran en UTC.

+2

¿No habrá ningún problema con Daylight Svaing Time? (Consulte [aquí] (http://www.timeanddate.com/time/change/usa/los-angeles)) – dmigo

+0

tengo más preguntas para esto, si quiero comenzar a diario y dos veces a las 12 a.m. y a las 12 p.m. , ¿Cómo hago eso? –

+0

@ NguyễnHuy. Supongo 'ITrigger gatillo = TriggerBuilder.Create() .WithDailyTimeIntervalSchedule (S => s.WithIntervalInHours (12)) .build();' 'o ITrigger gatillo = TriggerBuilder.Create() .WithDailyTimeIntervalSchedule (s => s.WithIntervalInHours (12) .OnEveryDay() .StartingDailyAt (TimeOfDay.HourAndMinuteOfDay (0, 0)) ) .build(); ' – sgmoore

15

Mientras WithIntervalInHours probablemente resolver esto y un cron como el horario es más flexible, quiero compartir otra solución: EndingDailyAfterCount(...)

var trigger = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule(s => s 
     .OnEveryDay() 
     .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(13, 00))) 
     .EndingDailyAfterCount(1)) 
.Build(); 
+1

bueno ... ¡esto también soluciona el problema del horario de verano de una manera realmente elegante! –

+0

@AndreasNiedermair Me alegro de poder ayudarlo, solo por mi conocimiento personal: ¿el cron de quartz.net tiene algún tipo de problema? –

+0

Ah, por lo que puedo recordar: el tiempo interno se almacena en UTC, por lo que es completamente independiente de DST; probablemente tendría que reprogramar trabajos después del cambio de horario de verano para reflejar el cambio en la marca de tiempo UTC asociada ... (Pero no lo hago) Saber hasta qué punto - en el futuro - los disparadores se agregan al agregar una expresión cron, o si se evalúan sobre la marcha) –

Cuestiones relacionadas