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.