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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: [1]
1  Programación / Java / 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.
2  Programación / Programación General / Problemas con eclipse en: 5 Noviembre 2010, 19:59 pm
Estoy programando aplicaciones para Android con eclipse y me acabo de dar cuenta que cada vez que ejecuto mi aplicacion, aumenta el consumo de memoria del eclipse, tanto que se pone toda la maquina lenta y necesita usar memoria virtual. Dudo mucho que sea mi aplicacion la que genere este problema porque....es el Hello World de android jajaj asi que si alguno le paso? o sabe como solucionarlo, joya.
3  Programación / Programación C/C++ / no ce termina de cerrar mi programa en: 6 Agosto 2010, 00:37 am
Hola estoy haciendo un jueguito con SDL y C++ con el IDE VS2008 y me arme una clase Game que tiene los metodos init(), loopGame() y end(). supuestamente en el main se ejecutan los 3, cuando el loop termina se ejecuta end() y despues de eso el respectivo return del main. Bueno nose que pasa pero cuando apreto ESC o el boton de salir, de mi pantalla de SDL, se cierra la ventana pero el procesos sigue corriendo, a que se puede deber esto??

Si, en el main, pongo exit(1) en vez de return 1, la ejecucion termina joya.

Lh: No hagas doble post, utiliza el botón modificar.

ya lo resolvi, en vez de poner atexit(SDL_Quit); solamente ponia SDL_Quit;
Ahora tengo otra pregunta: cuales son las desventajas de manejar los errores con IFs, osea a cada funcion que quiero usar chekeo el valor que retorna.
4  Programación / Programación C/C++ / reservar memoria para punteros en C en: 24 Mayo 2010, 18:28 pm
Hola a todos, tengo una duda sobre este tema. Entiendo que si declaro:

char *cadena;
cadena = (char*)malloc( (sizeof(char)*4) + 1);

estoy declarando un puntero a un string de 5 posiciones, pj: "HOLA"+'\0'.
Entonces tengo 2 preguntas:

1ro) que diferencia hay entre:
    (char*)malloc(sizeof(char)*5);
    (char*)malloc(sizeof(char*)*5);

2do) si lo que quiero es tener una lista de strings dinamica y declaro:

char **lista;

como declaro correctamente memoria para los distintos strings que quiera agregar a la lista? supongamos que los strings, en un determinado momento, son "hola1", "hola2", "hola3"
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines