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

Problema clase Date hora retrasada

Estas en el tema de Problema clase Date hora retrasada en el foro de Java en Foros del Web. Hola a todos, Tengo el siguiente problema en una aplicación que estoy desarrollando en Java. Necesito obtener la hora actual del sistema, para usarla posteriormente. ...
  #1 (permalink)  
Antiguo 03/09/2015, 04:57
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Problema clase Date hora retrasada

Hola a todos,

Tengo el siguiente problema en una aplicación que estoy desarrollando en Java.

Necesito obtener la hora actual del sistema, para usarla posteriormente. Creo un objeto de la clase Date de la siguiente forma:

Código:
Date now = new Date();
El problema es que el resultado es la hora actual, pero con 2 horas de retraso.

¿Alguien sabe decirme por qué ocurre esto?

Gracias por adelantado

Saludos
  #2 (permalink)  
Antiguo 03/09/2015, 05:20
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema clase Date hora retrasada

¿Cómo compruebas la hora?¿Con un print?

Tienes que tener en cuenta que a la hora de convertir la fecha a texto se tiene en cuenta la hora del sistema pero también el Locale (configuración de la zona) y el formato a que se convierte.

¿Cómo es el texto que te muestra?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 03/09/2015, 05:28
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

La hora la convierto a String y la uso como parte del nombre de un fichero que genera mi aplicación.

Código:
Date now = new Date();
String dateNow = dateFormat.format(now);			
String fileName = dirLog+"/"+dateNow+"_log.txt";
Al debuggear, veo que la variable now ya representa una fecha con dos horas menos:
Thu Sep 03 11:28:47 GMT 2015, cuando deberia ser 13:28:47

Por supuesto, luego al convertirla a String, la hora sigue siendo incorrecta.


Saludos
  #4 (permalink)  
Antiguo 03/09/2015, 05:40
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Cita:
Al debuggear, veo que la variable now ya representa una fecha con dos horas menos:
Thu Sep 03 11:28:47 GMT 2015, cuando deberia ser 13:28:47
Es correcto, ya que estas formateando el dato en formato GMT (en Espana el huso horario es GMT+2). Le has establecido el TimeZone en UTC?
Para nosotros es imposible saberlo, ya que no estas poniendo la parte realmente importante del codigo, es decir, donde creas el objeto dateFormat.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 03/09/2015, 07:08
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

Esta es la parte completa:

Código:
SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy_HHmmss",Locale.getDefault());
Date now = new Date();
String dateNow = dateFormat.format(now);
String fileName = dirLog+"/"+dateNow+"_log.txt";
¿Debo cambiar el segundo parametro del constructor SimpleDateFormat?

Creia que el constructor de la clase Date cogía la hora del sistema...

Saludos
  #6 (permalink)  
Antiguo 03/09/2015, 07:14
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Buenas,

El Locale.getDefault toma el valor que esta configurado en la JVM que lanza tu programa. En tu caso parece que esta tomando el valor GMT.

Has probado a ver que te devuelve?

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

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 03/09/2015, 07:17
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

Lo he solucionado de la siguiente forma:
Antes de todo el bloque de código que he puesto, he escrito la siguiente instrucción:

Código:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+2"));
Con eso establezco la zona horaria de España. Gracias a eso, con el mismo código que antes, obtengo la hora correcta.


Gracias y un saludo
  #8 (permalink)  
Antiguo 03/09/2015, 07:40
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Problema clase Date hora retrasada

Os equivocáis. La zona horaria española es la UTC+1.

Haced doble click en el reloj de Windows, y en las opciones de la hora veréis que es la zona horaria UTC+1 Madrid, París, Luxemburgo.

También lo podeis ver en Wikipedia y otras páginas web.

Entonces... por qué hay 2 horas de diferencia? Pues fácil, por el cambio de hora de verano. Digamos que la hora "standard" es la de invierno, y la de verano es el apaño. Que se le suma otra hora más.

Estos cambios de hora no están contemplados en los lenguajes de programación, que no saben las fechas en las que se va a producir estos cambios de horario verano-invierno. Y por eso deciden no contemplarlos.

Si necesitas contemplar esto en tu programa, te sugiero utilices el horario UTC+1... y luego, por ejemplo, utilices un check box para indicar si estás en horario de verano o invierno. De forma que el usuario tenga que marcarlo o desmarcarlo para sumar otra hora o no sumarla. De cualquier otra forma tendrás una hora inexacta cuando se cambie de horario al horario de invierno.
  #9 (permalink)  
Antiguo 03/09/2015, 08:03
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

No puedo tener un check en mi programa, puesto que es un programa de consola.

¿No existe alguna forma de que el programa detecte si estamos en horario de verano e invierno???

Es que si pongo

TimeZone.setDefault(TimeZone.getTimeZone("GMT+1")) ;

me da una fecha con una hora menos de la correcta. Necesito que el programa funcione bien tanto si es verano como invierno...debe existir alguna forma.


Gracias

Saludos
  #10 (permalink)  
Antiguo 03/09/2015, 08:10
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Cita:
Os equivocáis. La zona horaria española es la UTC+1.
Yo no he dicho nunca UTC+2.

Efectivamente es UTC+1, mas el horario de verano actual = GMT + 2 => +2 horas de diferencia con Greenwich.

Es cierto que la solucion tomada por @Marodal no es la correcta y que va a dejar de funcionar cuando cambie el horario de verano.
No me ha respondido lo que le devuelve el Locale.getDefault().toString(), pero deberia basarse en el Locale e investigar porque su locale del sistema no es correcto..

En cualquier caso, si prefiere cambiar el timezone por efecto y poner el de Espana deberia hacer:
Código Java:
Ver original
  1. TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid"));

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #11 (permalink)  
Antiguo 03/09/2015, 08:15
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

Locale.getDefault().toString() = es_ES

Eso es lo que imprime.

Vale, la solución es cambiar el TimeZone tal como me has indicado en el ultimo post:

TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid"));


Gracias, problema resuelto

Saludos
  #12 (permalink)  
Antiguo 03/09/2015, 08:17
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Cita:
No hay ninguna solucion?????
Código Java:
Ver original
  1. TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid"));

No te funciona?
__________________
If to err is human, then programmers are the most human of us
  #13 (permalink)  
Antiguo 03/09/2015, 08:21
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

En cualquier caso hay algo que no estas contando:

El codigo que pusiste:

Código Java:
Ver original
  1. SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy_HHmmss",Locale.getDefault());
  2. Date now = new Date();
  3. String dateNow = dateFormat.format(now);

Retorna un formato como este:
Cita:
03092015_112847
Y no esto:
Cita:
Thu Sep 03 11:28:47 GMT 2015
Con lo cual parece que dicho codigo no es el que genera la fecha invalida.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #14 (permalink)  
Antiguo 03/09/2015, 08:28
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

Thu Sep 03 11:28:47 GMT 2015 lo devuelve el objeto Date, veo su valor cuando debuggeo.

Obviamente, el resultado del programa es que resultado de formatear este objeto Date con la ayuda de la clase SimpleDateFormat.

Si el Locale.getDefault() es el correcto, ¿a que se puede deber entonces que no me pille la hora bien, y que tenga q especificar la zona horaria con el Timezone.setDefault?


Saludos
  #15 (permalink)  
Antiguo 03/09/2015, 08:32
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Cual de estas llamadas estas haciendo para imprimir el Date?

Cita:
System.out.println(new Date().toGMTString());
System.out.println(new Date().toLocaleString());
System.out.println(new Date().toString());
En mi sistema me devuelve:
Cita:
3 Sep 2015 14:31:57 GMT
3 sept. 2015 16:31:57
Thu Sep 03 16:31:57 CEST 2015
No estaras utilizando el primero de los metodos verdad?

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #16 (permalink)  
Antiguo 03/09/2015, 08:45
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Problema clase Date hora retrasada

Aver, no estoy imprimiendo nada de ninguna de esas maneras.

Este era mi bloque de código :

Código:
SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy_HHmmss",Locale.getDefault());
Date now = new Date();
String dateNow = dateFormat.format(now);
Luego utilizaba el String dateNow para las cosas que fueran...

dateNow tenia la fecha con formato ddMMyyyy_HHmmss, y se encontraba atrasada 2 horas con respecto a la hora real.

Al debuggear y ver el contenido de la variable now, esta contenia "Thu Sep 03 11:28:47 GMT 2015", y la hora estaba ya atrasada 2 hora. No era problema de la impresión, sino de la creación de la variable. Parece que cogía un timezone incorrecto, aunque el resultado de Locale.getDefault() era correcto.

La solución ha sido establecer el Timezone.setDefault....


Saludos
  #17 (permalink)  
Antiguo 03/09/2015, 08:53
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problema clase Date hora retrasada

Ok,

Es curioso. El Timezone por defecto se calcula:
-Primero mirando el valor de la variable del sistema user.timezone
-Si no lo encuentra, intenta recuerarlo a partir del sistema operativo.
-Si tampoco lo encuentra, entonces utiliza el GMT.

Parece que por algun motivo en tu sistema no es capaz de resolver el timezone.

Como nota final, otra forma que tienes que arreglarlo, aparte de hacer el Timezone.setDefault, es incluir un parametro como este en el arranque de tu aplicacion:

Cita:
-Duser.timezone=Europe/Madrid

Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: clase, date
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 06:05.