2014-05-23 18 views
6
  • la mia base di dati avendo (10 18 16? * Dom, Lun, mer, ven *) espressione cron poi come convertire in data Java.
  • come confrontare con l'ora di oggi.
  • e uno più è come confrontare a cron espressioni cioè (10 18 16? * Dom, Lun, mer, ven *) e (0 30 9 30 *?)
  • spiegare codice di esempio utilizzando programmazione al quarzo o alla primavera.

risposta

4

Si consiglia di esaminare la classe org.quartz.CronExpression nell'API Quartz.

Si noti che non è possibile confrontare semplicemente un'espressione cron con una data poiché l'espressione cron (in genere) rappresenta una sequenza di varie date. In ogni caso, si possono trovare i seguenti metodi utili:

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

Per quanto riguarda il confronto di due espressioni cron, cosa ti piacerebbe per confrontare? L'unica cosa che IMO ha senso confrontare sono le prossime date 'trigger', cioè le date ottenute dalle chiamate getNextValidTimeAfter ([alcune date di riferimento]).

+0

Si basa su Joda-Time? o cosa?! –

+0

Vogliamo convertire cron in data java. Qual è il metodo da raggiungere? –

+1

In genere, non è possibile convertire un'espressione cron in una singola istanza Date perché in genere un'espressione cron rappresenta una serie di date. Per ottenere la serie Date, penso che sia possibile chiamare ripetutamente il metodo getNextValidTimeAfter (Date) e utilizzare i valori restituiti come valore di input per la chiamata successiva. Per rispondere alla tua precedente domanda, Quartz API non utilizza Joda-Time, utilizza le API di data/calendario java.util. –

4

ho scritto una piccola classe per la gestione di espressioni cron, disponibile qui: https://github.com/frode-carlsen/cron

Sulla base di Joda-tempo, ma dovrebbe essere abbastanza facile da porto a Java8 tempo api. Ciò consente anche di integrare test unitari, fare simulazioni, ecc. Regolando l'offset DateTime in Joda-time.

Ha anche una buona copertura di test (è stato eseguito come TDD Kata).

Aggiornamento ora supporta Java 8 api tempo e grazie ad un contributo da github utente https://github.com/zemiak. In entrambi i casi, il parser di espressioni è una singola, minuscola classe che può essere facilmente copiata nel proprio progetto.

+0

È su Maven centrale? – oshai

+0

No, è solo una singola classe solo in base al tempo di joda, quindi non mi sono preoccupato.Sentiti libero di biforcarti o di copiare –

+0

Ehi, questo molto bello. Ho usato il tuo codice per sostituire cron-utils che dipendono da guava, un vaso mostro di oltre 2MB nel mio progetto: https://github.com/actframework/actframework/blob/master/src/main/java/fc/cron /CronExpression.java –

3

Forse è possibile controllare cron-utils Ha alcuni programmi di utilità per ottenere l'esecuzione successiva/precedente data certa data, es .: ora. Funziona con JodaTime, ma è possibile recuperare un JavaDate da lì. La libreria è agnostica del programma di pianificazione: basta fornire una stringa con un'espressione cron. È compatibile con JDK6.

+0

cron-utils è bello. L'unica cosa è che ha una dipendenza da guava che supera i 2MB –

+0

La dipendenza da guava era un problema. Dalla versione 5.0.0 sono stati rimossi migrando a JDK8. Ora la libreria ha anche meno dipendenze, dal momento che hanno anche eliminato Jodatime sfruttando il nuovo supporto Java per tempo. – kekec

+0

suona bene. Ma ora è bloccato su Java8. Finisco con l'utilizzo di questo parser per singolo file: https://github.com/frode-carlsen/cron/blob/master/src/main/java/fc/cron/CronExpression.java –

8

Utilizzare:

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()); 

... e allora ti suggerisco utilizzare Joda DateTime per il confronto data.

+0

Eccellente! Grazie mille! – DmitryKanunnikoff