2011-11-14 20 views
8

Tengo crontab-como programador. Tiempo definición "MM HH WD MD M":

mm- minutos
HH- horas
WD-días de la semana
MD - días del mes
M - mesCalcular Cron Próximo tiempo de ejecución en C#

WD, MD y M permiten múltiples entradas y cada uno de los parametros puede ser nulo, por ejemplo:

^^0, 1^^  means exucution every minute, every hour, at sunday and mondey, every day<br> 

35 15^^^ execution every day at 15.35<br> 

El problema es cómo calcular el próximo tiempo de ejecución, si sabe última fecha de ejecución. Sé cómo hacer esto utilizando un bucle (solo agregue 1 minuto hasta que se ajuste a la condición), pero debe haber una mejor manera.

+0

¿Necesita un DateTime? – kol

+0

Espero que no estés subestimando el trabajo. Si realmente quieres ser compatible con POSIX (POSIX), tendrás que atender un _lot más que eso_] (http://pubs.opengroup.org/onlinepubs/7908799/xcu/crontab.html) (Lo sé, Lo he implementado una vez en C++) – sehe

+2

@kol: Supongo que necesita Noda Time ** editar ** un _lote de tiempo _.... :) – sehe

Respuesta

14

He usado con éxito NCrontab para exactamente este fin.

usando algo como

var schedule = CrontabSchedule.Parse("15 35 * * *"); 
return schedule.GetNextOccurrence(DateTime.Now); 
+0

¡Genial! Pero una pregunta. Si, por ejemplo, SomeDate es el tiempo de ejecución GetNextOccurence (SomeDate) devolverá SomeDate? – user1016945

+0

Bastante seguro de que devolverá la siguiente ocurrencia, pero GetNextOccurrences (startTime, endTime) devolverá IEnumerable de todas las ocurrencias en ese rango. :) – devrooms

+0

parece haberse movido del código de google a github, pero no se proporcionan enlaces: https://github.com/atifaziz/NCrontab – froque

2

Usted puede código que usted mismo usando DateTime y TimeSpan - por ejemplo:

DateTime.Now == DateTime.Now.Date.AddHours (15).AddMinutes (35) 

comprueba si es 15:35 en la actualidad (y por lo tanto algunos de ejecución debe llevarse a cabo), verificaciones similares se pueden implementar para día de la semana, día del mes, etc.

o utilice una biblioteca .NET de opensource realmente agradable llamada NodaTime (es definitivamente una forma mejor).

Otra opción es utilizar una arquitectura diferente - para tales aplicaciones/servicios de tipo programador hay una biblioteca .NET de fuente abierta llamada Quartz (es incluso mejor) que hace muchos cálculos muy útiles en este contexto.

+1

No, esto no funcionará. 15:35! = Ahora + 15 horas + 35 minutos ... – kol

+1

@kol debe haber sobreread que no agregué a Now PERO hice la adición a ** DateTime.Now.Date ** que es medianoche así la adición aplica! – Yahia

+0

Vaya :) Muy buena idea! – kol

Cuestiones relacionadas