Consulta calculo de horas, entre dos fechas

Iniciado por Ghalad, 26 Abril 2012, 15:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Ghalad

Hola,

Estoy realizando parte de una aplicacion que se encarga de calcular, pasadas 2 fechas completas, el periodo transcurrid en horas.
Estoy utilizando la libreria joda-time, para calcular horas totales, el problema lo tengo cuando en el calculo se debe contemplar el horario laboral de 9 a 18, sabados, domingos y feriados.


El algoritmo que hice primero evalua si las fechas suministradas son del mismo dia, en tal caso se deberia contabilizar las horas que estan dentro de las 9 y las 18, menos la hora de almuerzo.

Si las fechas suministradas difieren (siempre la segunda fecha es posterior) primero suma la diferencia entre la fecha inicial y una fecha del mismo dia pero con horario de 18:00:00, e incrementa 1 dia a esa fecha inicial.
Luego evalua si la fecha inicial es del mismo dia que la final, si no lo es, sumo 8 horas. Si son del mismo dia suma la diferencia entre la fecha final y una fecha del mismo dia pero con horario de 9:00:00.

En teoria deberia funcionar, de hecho la segunda parte funciona bien, el problema esta cuando lasfechas inicial y fin son del mismo dia, y la verdad no quiero seguir agregando condiciones porque es una cagada....

si ayuda en algo pego codigo:

Código (java) [Seleccionar]


private final int ENTRADA = 9;
private final int SALIDA = 18;
private final int ALMUERZO_INICIO = 13;
private final int ALMUERZO_FIN = 14;


private Date fechaInicio;
private Date fechaFin;



public int tiempoRealEnHoras(){
int horas = 0;
GregorianCalendar inicio = new GregorianCalendar();
inicio.setTime(this.fechaInicio);
GregorianCalendar fin = new GregorianCalendar();
fin.setTime(this.fechaFin);

if(this.mismoDia(inicio, fin)){
horas += this.sumarHorasDelDia(inicio, fin);
}else{
horas += this.sumarHoras(this.SALIDA, inicio);
inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);

while(!this.mismoDia(inicio, fin)){
if(this.diaHabil(inicio) && this.diaFeriado(inicio))
horas += 8;
inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
}

horas += this.sumarHoras(this.ENTRADA, fin);
}
return horas;
}

private int sumarHoras(int hora, GregorianCalendar cal){
int horasParciales = 0;

if(this.diaHabil(cal) && this.diaFeriado(cal)){
Date dt = cal.getTime();
dt.setHours(hora);
dt.setMinutes(0);
dt.setSeconds(0);

if(hora == this.ENTRADA) //calculo de horas finales ( de 9hs a Xhs)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) > this.ENTRADA)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours();
else //calculo de horas iniciales ( de Xhs a 18hs)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) < this.SALIDA)
if(cal.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO)
horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours();
}
return horasParciales > 8? 8 : horasParciales;
}

private int sumarHorasDelDia(GregorianCalendar inicio, GregorianCalendar fin){
int horasParciales = 0;

if(this.diaHabil(inicio) && this.diaFeriado(inicio)){
if(inicio.get(GregorianCalendar.HOUR_OF_DAY) < this.ENTRADA || inicio.get(GregorianCalendar.HOUR_OF_DAY) > this.SALIDA){
int diferenciaHoras = Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
inicio.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA);
fin.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA + diferenciaHoras);
}

if(inicio.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO && fin.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours() - 1;
else
horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
}
return horasParciales > 8? 8 : horasParciales;
}


Se parece mas a codig C que a java pero bueno...me piden eso y tiene que ser muy preciso. Si se les cae alguna idea, bien barbaro jaaja.

Gracias.