2010-05-01 6 views
6

Me gustaría calcular fecha de finalización (y hora) de un evento. Sé fecha de inicio y duración (en minutos). Pero:Cálculo de la fecha de finalización mientras se salta vacaciones + tiempo Joda

  1. tengo que saltar vacaciones - situación no recurrente
  2. que tiene que saltarse los fines de semana - recurrente situación
  3. tengo que no tiempo de trabajo recuento (por ejemplo: de 8:00 am hasta las 5 : 00pm) - situación recurrente, pero con una granularidad más fina

¿Hay una manera simple de lograr estos casos usando la biblioteca de tiempo Joda?

Respuesta

2

Jodatime te ayudará -mucho diría-, pero necesitarás escribir la lógica tú mismo, un bucle omitiendo algunos días enteros y algunas veces del día. No es muy simple, ni muy complejo, me parece.

+0

Marcar como respuesta aceptada, porque es verdad. De acuerdo con mis investigaciones, no hay una solución simple. Y Jodatime es definitivamente útil. – picca

1

Primero tienes que definir "vacaciones". No todos los lugares tienen los mismos, por lo que esto debe hacerse genérico y conectable.

No creo que sea "simple".

+0

En mi caso, las vacaciones se almacenan en una base de datos. Pero quería señalar que no puedo usar: if (dayofweek() == 7) {skip(); } – picca

1

¿Has consultado el proyecto Holiday calculation? aparece en los proyectos relacionados de jodatime y podría ser útil

+0

Se ve muy bien. Pero todavía no sé cómo manejar las horas de trabajo. Básicamente necesito acelerar la fecha dada por N minutos. Saltarse las horas de trabajo, vacaciones, etc. – picca

0

Aquí hay un código que uso. dtDateTimes puede contener sus fechas de vacaciones predefinidas (por ejemplo, vacaciones en el Reino Unido) y dtConstants puede contener elementos recurrentes con los que le gustaría hacer coincidir, como 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; 
} 
Cuestiones relacionadas