Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con Calendar

Estas en el tema de Problema con Calendar en el foro de Java en Foros del Web. Hola, les comento de un problema que aun no puedo resolver y me genera algunas dudas sobre el origen. Tengo el siguiente codigo: Calendar cal ...
  #1 (permalink)  
Antiguo 18/01/2012, 12:08
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Pregunta Problema con Calendar

Hola, les comento de un problema que aun no puedo resolver y me genera algunas dudas sobre el origen.

Tengo el siguiente codigo:

Calendar cal = Calendar.getInstance();
Date fechaHora = cal.getTime();
//Imprimo sin formato
System.out.println("Fecha Hora actual = "+ fechaHora);


Lo que observo luego de ejecutar este codigo es que la hora que arroja el programa es diferente a la del reloj del sistema operativo.

¿Cómo puede ser posible? la diferencia que muestra es de exactamente 1 hora.

¿Debo jacer algún manejo de la clase TimeZone?

Gracias, saludos
__________________
Software Neuquén
  #2 (permalink)  
Antiguo 18/01/2012, 16:17
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Problema con Calendar

Hola,

Como muchas cosas es relativo y depende de muchos factores; por ejemplo si tienes bien configurado el país y el idioma en el sistema operativo.

Hay dos formas de manejar el reloj, una es usar el reloj hardware en UTC y la otra es llevar un reloj por software que agrega o quita horas dependiendo de tu ubicación al reloj hardware.

Por decirlo así, cuando son las 12:00 del medio día en el meridiano de Greenwich GMT puede ser que sean las 19:00 de la noche en tu país y adicionalmente a eso hay que quitarle o sumarle horas dependiendo si tu país está afecto a 'daylight saving'. En este caso el reloj hardware interno de la PC indica 12:00 pero tu ves 19:00 porque así está configurado el sistema. El otro caso es que el reloj de la PC interno diga 19:00 y sean las 19:00 realmente.

Primero tendrías que saber cual es la hora real de tu PC viendo el BIOS (si la muestra), segundo tendrías que saber si el sistema operativo está en reloj harware o software (en Windows siempre está en hardware pero Linux puede estar en uno u el otro).

Después tienes que revisar que el sistema operativo y la consola donde está corriendo tu programa está bien configurada en el TimeZone y el Locale. Podrías averiguar el TimeZone con:

Código Java:
Ver original
  1. System.out.println(TimeZone.getDefault());

También podrías probar a usar el constructor con TimeZone:

Código Java:
Ver original
  1. Calendar.getInstance(TimeZone.getTimeZone("Hora estándar de Alaska"));

También tienes que ver si el reloj que te muestra la hora de tu PC realmente está mostrando la hora correcta (no la hora correcta de tu pais, la hora correcta del reloj hardware de tu PC). Por cierto, lo mas probable es que no esté bien configurado el TimeZone en tu sistema operativo y hace 'daylight savings', le quita o suma una hora al día durante un periodo del año.

Saludos,

Última edición por HackmanC; 18/01/2012 a las 16:28 Razón: edit
  #3 (permalink)  
Antiguo 18/01/2012, 18:47
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Problema con Calendar

Gracias por la respesta, he probado y setenado adecuadamente el TimeZone en los objetos Calendar, he obtenido el resultado deseado.

El problema ahora es que estoy persistiendo ese dato en una base de datos SQL server utilizando jdbc y nuevamente se presenta el problema. Aun seteando el TimeZone... algo asi:

Calendar cal = Calendar.getInstance(Timezone("GMT-3")); //Algo asi
Timestamp ts = new Timestamp(cal.getTimeofMillis());

statemet.setTimestamp(x,ts);

...

el driver persiste la hora de forma incorrecta, sospecho de tener que configurar el driver, es esto posible? alguien tiene idea?

gracias
__________________
Software Neuquén
  #4 (permalink)  
Antiguo 18/01/2012, 19:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Problema con Calendar

Hola,

Código Java:
Ver original
  1. TimeZone.setDefault(TimeZone.getTimeZone("GMT+3"));

Prueba a poner el valor por defecto en la zona horaria que estás usando como la primera instrucción de todo tu programa, preferiblemente en el main. Y no uses otro en todo el programa. Pero un detalle a tomar en cuenta es que si llevas tu programa a otro lado siempre va a mantener la zona horaria en GMT+3. Lo adecuado es corregir la zona horaria en tu sistema operativo para que refleje la hora exacta.

Saludos,

Última edición por HackmanC; 18/01/2012 a las 19:53
  #5 (permalink)  
Antiguo 20/01/2012, 09:23
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
De acuerdo Respuesta: Problema con Calendar

Muchas gracias, me fue de gran utilidad.

Al setear

Código PHP:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+3")); 
Se resolvieron todos los problemas! para dejar manejable el TimeZone, lo paso por parámetro a al aplicación en el arranque.

Saludos
__________________
Software Neuquén
  #6 (permalink)  
Antiguo 20/01/2012, 13:11
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Problema con Calendar

Hola,

También es posible pasar ese valor directamente a la VM de Java y cambiar el valor por defecto. Osea en ese caso que se lo vas a pasar por parámetros también podías haberlo hecho directamente desde la línea de comandos usando las System Properties.

Código:
java -Duser.timezone=GMT+3 MyApp
Saludos,

Etiquetas: clase, calendario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:07.