2010-05-01 4 views
6

Vorrei calcolare data di fine (e ora) di un evento. Conosco data di inizio e durata (in minuti). Ma:Calcolo della data di fine mentre si salta la festività + ora Joda

  1. devo saltare vacanze - situazione non ricorrente
  2. devo saltare fine settimana - situazione ricorrente
  3. devo non tempo di lavoro conteggio (ad esempio: dalle 8:00 alle 5 : 00:00) - situazione ricorrente, ma con granularità più fine

C'è un modo semplice per ottenere questi casi utilizzando la libreria di tempo Joda?

risposta

2

Jodatime ti aiuterà, direi molto, ma dovrai scrivere tu stesso la logica, un ciclo che salta alcuni giorni interi e alcune volte della giornata. Non molto semplice, né molto complesso, mi sembra.

+0

Contrassegnare come risposta accettata, perché è vero. Secondo le mie ricerche, non esiste una soluzione semplice. E Jodatime è sicuramente utile. – picca

1

Per prima cosa devi definire "vacanze". Non tutte le localizzazioni hanno le stesse, quindi questo deve essere reso generico e collegabile.

Non penso che sia "semplice".

+0

Nel mio caso le vacanze sono memorizzate in un database. Ma volevo sottolineare che non posso usare: if (dayofweek() == 7) {skip(); } – picca

1

Hai esaminato il progetto Holiday calculation? è presente nei progetti correlati di jodatime e potrebbe essere utile

+0

Sembra davvero buono. Ma ancora non so come gestire l'orario di lavoro. Fondamentalmente ho bisogno di velocizzare la data specificata di N-minuti. Salto orario di lavoro, vacanze, ecc ... – picca

0

Ecco un po 'di codice che uso. dtDateTimes può contenere le date predefinite per le festività (ad es. Festività in UK) e dtConstants può contenere elementi ricorrenti ai quali si desidera confrontare, ad esempio DateTimeConstants.SATURDAY.

/** 
* Returns a tick for each of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* occurring in the period as represented by begin -> end. 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
* @return 
*/ 
public int numberOfOccurrencesInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    int counter = 0; 
    for (DateTime current = begin; current.isBefore(end); current = current.plusDays(1)) { 
     for (Integer constant : dtConstants) { 
      if (current.dayOfWeek().get() == constant.intValue()) { 
       counter++; 
      } 
     } 
     for (DateTime dt : dtDateTimes) { 
      if (current.getDayOfWeek() == (dt.getDayOfWeek())) { 
       counter++; 
      } 
     } 

    } 
    return counter; 
} 

/** 
* Returns true if the period as represented by begin -> end contains any one of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
*/ 
public boolean isInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    return numberOfOccurrencesInPeriod(begin, end, dtConstants, dtDateTimes) > 0; 
} 
Problemi correlati