2017-03-07 7 views
0

Ich arbeite an einem Projekt, das Benutzern ermöglicht, eine Aufgabe einzugeben, die einem ähnlichen Format wie Cron folgt. Momentan muss ich feststellen können, wann das nächste Mal die Aufgabe ausgeführt werden und die Anzahl der Sekunden bis zu dieser Zeit erhalten soll. Hier sind ein paar Beispiele für das verwendete Format und die erwarteten Ergebnisse.Verzögerung für Kalenderzeitplanformat erhalten

Format: (second) (minute) (hour) (day) (month) 
      0-59  0-59 0-23 1-31 1-12 

(##): States the exact value for the parameter 
(*): Accepts all values (effectively ignores the parameter) 

Step Modifier (/##): Considers all whole number multiples of ## 

30 * * * * -> Runs a task every minute when second = 30 
0 /5 * * * -> Runs a task every 5 minutes (at 0, 5, 10, etc.) when second = 0 
13 /15 /2 * * -> Runs a task every 15 minutes when seconds = 13 and hour is even 

Hier sind ein paar Beispiele, was ich tun muss, um dies zu analysieren.

Example time: July 6th, 5:34:12 (24 hour) 
In modified format: 12 34 5 6 7 

30 * * * * -> returns 18 (next task runs at 5:34:30) 
0 /5 * * * -> returns 48 (next task runs at 5:35:00) 
13 /15 /2 * * -> returns 1561 (next task runs at 6:00:13) 

Ich habe eine Reihe verschiedener Ansätze ausprobiert und haben brachte es sogar zu meinem Lehrer und anderen Schülern jedoch niemand eine Lösung entwickeln konnte. Die Programmierung ist der einfache Teil, aber es ist die Logik, die mir entgeht. Wenn jemand einen Vorschlag machen kann, wäre ich sehr dankbar.

Die einzige Bibliothek, die ich verwenden möchte, ist java.util.Calendar, die einfach die aktuelle Zeit erhält, dann Calendar.getInstance().SECONDS oder andere Zeiteinheiten verwenden.

Antwort

0

einfache Strategie:

  • Convert Schrittwerte und Platzhalter in Zeitplan-Listen, zum Beispiel 0 0 /6 1 * werden 0 0 0,5,11,17,23 1 1,2,3,4,5,6,7,8,9,10,11,12.
  • Erstellen Sie ein neues Datum, das jetzt initialisiert wird.
  • Passt der Monat zu einem der Monate des Zeitplans? Wenn nicht, erhöhen Sie den Monat des Datums, bis es übereinstimmt.
  • Dann überprüfen Sie den Tag; Passt es zu einem der Tage des Zeitplans? Wenn nicht, inkrementieren Sie es, bis es übereinstimmt.
  • Dann überprüfen Sie die Stunde ...
  • Und so weiter, bis das ganze Datum dem Zeitplan entspricht.
  • Dann subtrahieren Sie das aktuelle Datum von diesem übereinstimmenden Datum, um die Verzögerung zu erhalten.
+0

Ich habe es tatsächlich nach einer Weile aufgegeben und habe nie daran gedacht, hier nachzuschauen, bis ich es wieder geöffnet habe. Das Problem dabei ist die Überlappung - wenn der Zeitplan ungefähr eine Stunde umfassen muss; Diese Methode schlägt fehl. Dies wird aufgrund des oben beschriebenen Stufenmodifikators noch schwieriger. Leider ist das keine einfache Strategie. –

+0

@JayCastell Ich habe meine Antwort aktualisiert, um Sie bei Schrittwerten zu unterstützen. Ich glaube nicht, dass Überschneidungen ein Problem sind, wenn Sie meiner Strategie folgen. Aber vielleicht verpasse ich etwas und du kannst ein Beispiel geben, wo das scheitern würde. –