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:
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.
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.