Hora Actual en JAVA

1,575 views
Skip to first unread message

Iván

unread,
Feb 11, 2009, 2:51:28 PM2/11/09
to jug.cl
Estimad@s,

Encontré este grupo buscando una respuesta a mi pregunta que tal vez
es media básica, pero que aún no entiendo como se resuelve....

Necesito obtener la hora actual (hora del servidor), pero tengo
problemas con la zona horaria (horario de verano). Tengo varios
ejemplos de como obtener la HORA y setear la Zona horaria, pero como
sea obtengo la hora actual con 1 hora menos.


// --- PRUEBA 1 ---
SimpleDateFormat[] sdfs = {
new SimpleDateFormat("dd-MM-yyyy h:mm a"),
new SimpleDateFormat("dd/MMM/yy HH:mm:ss"),
new SimpleDateFormat("EEEE dd 'de' MMMM 'de' yyyy
h:mm:ss:SSS")
};
Date d = new Date();
System.out.println("Prueba 1: " + sdfs[1].format(d));

// --- PRUEBA 2 ---
Calendar fecha = Calendar.getInstance();
fecha.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("Prueba 2: " + fecha.getTime());

// --- PRUEBA 3 ---
TimeZone tz = TimeZone.getTimeZone("PST");
Calendar fc = Calendar.getInstance(tz);
fc.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("Prueba 3: " + fc.getTime());

// --- PRUEBA 4 ---
Calendar f = Calendar.getInstance();
f.setTimeZone(TimeZone.getTimeZone("GMT-4"));
f.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("Prueba 4: " + f.getTime());

******* RESPUESTA CONSOLA a las 16:41 ********
Prueba 1: 11/feb/09 15:41:42
Prueba 2: Wed Feb 11 15:41:42 VET 2009
Prueba 3: Wed Feb 11 15:41:42 VET 2009
Prueba 4: Wed Feb 11 15:41:42 VET 2009



Sé que esto lo puedo solucionar con un fecha.add(Calendar.HOUR_OF_DAY,
1), pero en el horario de invierno tendré el mismo error...

Que hacen ustedes en estos casos?

Ariel Alejandro Aguayo Bascu~an

unread,
Feb 11, 2009, 3:20:39 PM2/11/09
to jug.cl
On Wed, 11 Feb 2009, Iván wrote:

Hola!

Primero tienes que entender cual es el significado de ciertas clases en
Java.. bueno, yo no te puedo dar la definicion estricta, pero al menos te
puedo dar una idea.

La primera clase es java.util.Date (y derivados). Los objetos "Date" son
momentos "universales" en el tiempo.. o sea, un instante especifico medido
segun una coordenada establecida (segundos desde el 1ro de Enero de 1970
UTC.. lo que se llama POSIX Time). Antiguamente el objeto Date tenia
atributos como dia, mes, hora (en realidad aun los tienen pero
deprecados).. en terminos de disenno eso estaba malo porque en realidad
esos atributos son parte de un calendario especifico (en este caso el
calendario gregoriano). Ahi es donde aparecen otras 2 clasesillas:
Calendar y GregorianCalendar (esta ultima como implementacion de la
primera). Tenemos entonces que:

Un "date" es un momento en el tiempo (expresado como segundos desde
1/1/1970 en GMT-0).. los calendarios son la forma en que escribimos ese
momento en el tiempo.. es decir, un mismo "date", un mismo instante en el
tiempo, puede ser el dia 11/02/2009 13:00 para mi, algo asi como 1/1/5600
segun el calendario judio y "dia del pez, año del oso" en calndario
chino... los calendarios en la practica son solo mascaras "visuales" de
una fecha. Se entiende? Cuando tu haces System.out.println(new Date()) lo
que java hace por ti es desplegar esa fecha segun tu calendario por
omision, tomando la informacion de tu sistema (zona horaria, daylight
saving, etc).

Falta un actor mas en tu problema: SimpleDateFormat. Esta clase lo que
hace es tranformar String->Date y viceversa. Es decir, convierte la
representacion "visual" de una fecha en una fecha real. El tipico problema
que ocurre al usar SimpleDateFormat es que esa representacion "visual"
carece de cierta informacion.. y cuando esto es asi la clase tiene que
hacer supuestos. El caso mas tipico es:

"11/02/2009" representa una fecha, pero no indica la zona horaria, si no
poseemos la zona horaria SimpleDateFormat asume la de la maquina virtual.
La regla general para no tener problemas es que nunca debes omitir
informacion y/o siempre transferir internamente las fecha como objetos del
tipo que corresponde y no como String.


Que es lo que probablemente te esta pasando a ti?

La hora que estas viendo probablemente esta correcta.. pero la estas
visualizando en una zona horaria que no es la tuya. Si le agregas una "z"
a tu patron, por ejemplo: "dd-MM-yyyy h:mm a z" deberias ver la fecha con
la zona horaria del servidor... pero aun estara corrida. Lo que tu quieres
es ver la hora segun TU zona horaria, o sea, la de chile continenal. Para
cambiar la zona horaria en que imprime el objeto SimpleDateFormat puedes
usar sdf.setTimeZone(TimeZone.getTimeZone("America/Santiago")).

Eso.
----
Ariel Aguayo B. (arag...@dcc.uchile.cl)

"Vale la pena morir por todo aquello sin lo cual no vale la pena vivir..."
Salvador Allende.

Mauricio Gomez

unread,
Feb 11, 2009, 3:51:13 PM2/11/09
to ju...@googlegroups.com
Excelente explicación Ariel... registrada será en la KB.
--
El que sabe, sabe. Y el que no sabe, TRABAJA. - El Jefe

Iván Moyano

unread,
Feb 11, 2009, 3:57:24 PM2/11/09
to ju...@googlegroups.com
Claramente genial y sus argumentos teóricos muy bien fundados!
Se agradece Ariel...

Muy buen grupo!
--
Saludos,
Iván Moyano Varas
http://www.moyano.cl
Reply all
Reply to author
Forward
0 new messages