2014-05-23 6 views
6
  • meine Datenbank mit (10 18 16? * So, Mo, Mi, FRI *) cron Ausdruck dann, wie in Java-Datum zu konvertieren.
  • wie mit der heutigen Zeit zu vergleichen.
  • und ein mehr ist, wie Ausdrücke zu vergleichen, um cron dh (10 18 16? * SUN, MO, MI, FR *) und (0 30 9 30 *?)
  • bitte Beispielcode erklären mit Quarz- oder Federzeitplanung.

Antwort

4

Sie können in der Quartz API in die org.quartz.CronExpression Klasse suchen.

Bitte beachten Sie, dass Sie einen Cron-Ausdruck nicht einfach mit einem Datum vergleichen können, da der Cron-Ausdruck (typischerweise) eine Sequenz verschiedener Daten darstellt. In jedem Fall können Sie die folgenden Methoden nützlich finden:

public boolean isSatisfiedBy(Date date) 
public Date getNextValidTimeAfter(Date date) 

Wie zum Vergleich zweier cron Ausdrücke, was würden Sie vergleichen wollen? Die einzige Sache, die IMO zum Vergleichen sinnvoll ist, sind die nächsten "Trigger" -Daten, d. H. Daten, die von getNextValidTimeAfter ([irgendein Referenzdatum]) -Aufrufen erhalten werden.

+0

Basiert es auf Joda-Time? oder was?! –

+0

Wir wollen Cron in Java-Datum konvertieren. Was ist die Methode zu erreichen? –

+1

Sie können einen Cron-Ausdruck normalerweise nicht in eine einzelne Date-Instanz konvertieren, da ein Cron-Ausdruck normalerweise eine Folge von Daten darstellt. Um die Date-Reihe zu erhalten, können Sie die Methode getNextValidTimeAfter (Date) wiederholt aufrufen und die zurückgegebenen Werte als Eingabewert für den nächsten Aufruf verwenden. Um Ihre frühere Frage zu beantworten, verwendet die Quartz API Joda-Time nicht, sie verwendet java.util Date/Calendar APIs. –

4

schrieb ich eine kleine Klasse für cron Ausdrücke Handling, finden Sie hier: https://github.com/frode-carlsen/cron

Basierend auf Joda-Zeit, sollte aber recht einfach zu portieren zu Java8 Zeit api sein. Dies ermöglicht es auch, in Komponententests einzubetten, Simulationen usw. durchzuführen, indem der DateTime-Offset in der Joda-Zeit angepasst wird.

Es hat auch ziemlich gute Testabdeckung (wurde als TDD Kata gemacht).

aktualisieren unterstützt nun auch Zeit api Java 8 dank einem Beitrag von Github Benutzer https://github.com/zemiak. In beiden Fällen ist der Ausdrucksparser eine einzelne, kleine Klasse, die leicht in Ihr eigenes Projekt kopiert werden kann.

+0

Ist es auf Maven Central? – oshai

+0

Nein, es ist nur eine einzige Klasse, die nur von joda abhängt, also habe ich mich nicht darum gekümmert.Fühlen Sie sich frei zu Gabel oder Kopie –

+0

Hey, das ist sehr cool. Ich habe deinen Code benutzt, um cron-utils zu ersetzen, die von Guava abhängen, einem über 2 MB großen Monster-Krug in meinem Projekt: https://github.com/actorefamework/actframework/blob/master/src/main/java/fc/cron /CronExpression.java –

3

Vielleicht können Sie überprüfen, cron-utils Es hat einige Utils zu nächsten/vorherigen Ausführung für ein bestimmtes Datum erhalten, ex .: jetzt. Funktioniert mit JodaTime, aber Sie könnten ein JavaDate von dort abrufen. Die Bibliothek ist Scheduler Agnostic: Sie geben nur eine Zeichenfolge mit einem Cron-Ausdruck. Ist kompatibel mit JDK6.

+0

cron-utils ist nett. Die einzige Sache ist, hat es Guava-Abhängigkeit, die über 2 MB ist –

+0

Guava-Abhängigkeit war ein Problem. Seit Version 5.0.0 haben sie es durch Migration auf JDK8 entfernt. Jetzt hat die Bibliothek noch weniger Abhängigkeiten, da sie auch Jodatime von der neuen Java-Unterstützung für die Zeit loswerden. – kekec

+0

klingt gut. Aber jetzt ist es an Java8 gebunden. Ich benutze diesen Parser für einzelne Dateien: https://github.com/frode-carlsen/cron/blob/master/src/main/java/fc/cron/CronExpression.java –

8

Bitte verwenden:

import org.springframework.scheduling.support.CronSequenceGenerator; 

final String cronExpression = "0 45 23 * * *"; 
final CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression); 
final Date nextExecutionDate = generator.next(new Date()); 

... und dann schlage ich Joda Datetime für Datum Vergleich zu verwenden.

+0

Ausgezeichnet! Vielen Dank! – DmitryKanunnikoff