elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Consulta calculo de horas, entre dos fechas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta calculo de horas, entre dos fechas  (Leído 2,935 veces)
Ghalad

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Consulta calculo de horas, entre dos fechas
« en: 26 Abril 2012, 15:57 pm »

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
  1.  
  2. private final int ENTRADA = 9;
  3. private final int SALIDA = 18;
  4. private final int ALMUERZO_INICIO = 13;
  5. private final int ALMUERZO_FIN = 14;
  6.  
  7.  
  8. private Date fechaInicio;
  9. private Date fechaFin;
  10.  
  11.  
  12.  
  13. public int tiempoRealEnHoras(){
  14. int horas = 0;
  15. inicio.setTime(this.fechaInicio);
  16. fin.setTime(this.fechaFin);
  17.  
  18. if(this.mismoDia(inicio, fin)){
  19. horas += this.sumarHorasDelDia(inicio, fin);
  20. }else{
  21. horas += this.sumarHoras(this.SALIDA, inicio);
  22. inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
  23.  
  24. while(!this.mismoDia(inicio, fin)){
  25. if(this.diaHabil(inicio) && this.diaFeriado(inicio))
  26. horas += 8;
  27. inicio.add(GregorianCalendar.DAY_OF_MONTH, 1);
  28. }
  29.  
  30. horas += this.sumarHoras(this.ENTRADA, fin);
  31. }
  32. return horas;
  33. }
  34.  
  35. private int sumarHoras(int hora, GregorianCalendar cal){
  36. int horasParciales = 0;
  37.  
  38. if(this.diaHabil(cal) && this.diaFeriado(cal)){
  39. Date dt = cal.getTime();
  40. dt.setHours(hora);
  41. dt.setMinutes(0);
  42. dt.setSeconds(0);
  43.  
  44. if(hora == this.ENTRADA) //calculo de horas finales ( de 9hs a Xhs)
  45. if(cal.get(GregorianCalendar.HOUR_OF_DAY) > this.ENTRADA)
  46. if(cal.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
  47. horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours() - 1;
  48. else
  49. horasParciales += Hours.hoursBetween(new DateTime(dt), new DateTime(cal.getTime())).getHours();
  50. else //calculo de horas iniciales ( de Xhs a 18hs)
  51. if(cal.get(GregorianCalendar.HOUR_OF_DAY) < this.SALIDA)
  52. if(cal.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO)
  53. horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours() - 1;
  54. else
  55. horasParciales += Hours.hoursBetween(new DateTime(cal.getTime()), new DateTime(dt)).getHours();
  56. }
  57. return horasParciales > 8? 8 : horasParciales;
  58. }
  59.  
  60. private int sumarHorasDelDia(GregorianCalendar inicio, GregorianCalendar fin){
  61. int horasParciales = 0;
  62.  
  63. if(this.diaHabil(inicio) && this.diaFeriado(inicio)){
  64. if(inicio.get(GregorianCalendar.HOUR_OF_DAY) < this.ENTRADA || inicio.get(GregorianCalendar.HOUR_OF_DAY) > this.SALIDA){
  65. int diferenciaHoras = Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
  66. inicio.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA);
  67. fin.set(GregorianCalendar.HOUR_OF_DAY, this.ENTRADA + diferenciaHoras);
  68. }
  69.  
  70. if(inicio.get(GregorianCalendar.HOUR_OF_DAY) <= this.ALMUERZO_INICIO && fin.get(GregorianCalendar.HOUR_OF_DAY) >= this.ALMUERZO_FIN)
  71. horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours() - 1;
  72. else
  73. horasParciales += Hours.hoursBetween(new DateTime(inicio.getTime()), new DateTime(fin.getTime())).getHours();
  74. }
  75. return horasParciales > 8? 8 : horasParciales;
  76. }
  77.  

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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consulta Con fechas
Programación Visual Basic
TheGhost(Z) 2 1,872 Último mensaje 12 Julio 2007, 00:54 am
por TheGhost(Z)
comparar horas, fechas..... C# (solucionado)
.NET (C#, VB.NET, ASP)
skan 3 30,580 Último mensaje 24 Noviembre 2008, 10:42 am
por skan
[Consulta] Calculo vectorial...
Foro Libre
BlackZeroX 4 3,383 Último mensaje 21 Septiembre 2011, 10:59 am
por Darkgold9
intervalo entre fechas
Programación Visual Basic
z_ane_666 4 2,714 Último mensaje 8 Noviembre 2011, 13:34 pm
por 79137913
horas y fechas
PHP
kakashi20 3 2,972 Último mensaje 17 Marzo 2012, 02:40 am
por dark_sargon
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines