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
private final int ENTRADA = 9; private final int SALIDA = 18; private final int ALMUERZO_INICIO = 13; private final int ALMUERZO_FIN = 14; public int tiempoRealEnHoras(){ int horas = 0; inicio.setTime(this.fechaInicio); fin.setTime(this.fechaFin); if(this.mismoDia(inicio, fin)){ horas += this.sumarHorasDelDia(inicio, fin); }else{ horas += this.sumarHoras(this.SALIDA, inicio); while(!this.mismoDia(inicio, fin)){ if(this.diaHabil(inicio) && this.diaFeriado(inicio)) horas += 8; } horas += this.sumarHoras(this.ENTRADA, fin); } return horas; } int horasParciales = 0; if(this.diaHabil(cal) && this.diaFeriado(cal)){ dt.setHours(hora); dt.setMinutes(0); dt.setSeconds(0); if(hora == this.ENTRADA) //calculo de horas finales ( de 9hs a Xhs) 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) 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; } 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(); } 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.