Frage

Was ist ein effizienter Weg, um die nächste Laufzeit eines Ereignisses die aktuelle Uhrzeit und ein Cron-spec zu berechnen gegeben?

Ich suche nach etwas anderes als „Schleife durch jede Minute zu überprüfen, ob es spec entspricht“.

Beispiele für Spezifikationen könnten sein:

  • Jeder Monat, am ersten und 15 um 15:01 Uhr
  • Bei 10.20.30.40.50 Minuten nach der vollen Stunde jede Stunde

Python-Code wäre schön, aber Pseudo-Code oder High-Level-Beschreibung würde auch geschätzt werden.

[Update] Angenommen, die Spezifikation bereits analysiert und ist in einem vernünftigen Format.

War es hilfreich?

Lösung

Just Blick auf sie, ich glaube, Sie müssen:

  • parsen die chron spec zu fünf Arrays akzeptabler Werte für jedes Feld enthält;
  • Parse 'jetzt' auf einen Wert für jedes Feld;
  • , um von Minute, Stunde, {Tag-of-Monat oder Tag-of-Woche} Monaten des Jahres. Finden Sie den niedrigsten Array-Wert das entspricht oder den aktuellen Wert überschreitet, Korrektur für Carry

Ich weiß nicht, wie zu handhaben Tag-of-Woche und Tag-of-Monat gleichzeitig; Ich bin sicher, dass es einen Weg gibt, aber auf der anderen Seite Ich glaube nicht, dass ich eine spec gesehen habe, dass beide tatsächlich angegeben. Ich denke, es würde ausreichen, um einen Handler für entweder zu schreiben und einen Fehler aus, wenn Sie beide erhalten.

Edit: offenbar, wenn Tag-der-Woche und Tag-of-Monat beide angegeben werden, es soll das Feuer auf beide - das heißt, wenn die Regel "ist 15., Mittwoch‘es wird auf jedem 15. Feuer und jeden Mittwoch.

Das croniter Paket tut, was Sie wollen:

import croniter
import datetime

now = datetime.datetime.now()
sched = '1 15 1,15 * *'    # at 3:01pm on the 1st and 15th of every month
cron = croniter.croniter(sched, now)

for i in range(4):
    nextdate = cron.get_next(datetime.datetime)
    print nextdate

druckt

2011-01-15 15:01:00
2011-02-01 15:01:00
2011-02-15 15:01:00
2011-03-01 15:01:00

obwohl es wäre schön, wenn es als eine tatsächliche Iterator geschrieben wurde. Vielleicht habe ich mein nächstes Projekt bekam; -)

Andere Tipps

Later.js ist eine Javascript-Bibliothek, die genau dies tut. Es ist in der Lage einen Cron Ausdruck zu analysieren und dann zukünftige Ereignisse des Zeitplans zu berechnen. Es Algorithmus ist nicht sehr schick, aber es macht den Job. sein könnte einen Blick wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top