Problemas de cambios horarios con fechas en Java

Posted by Pablo · Leave a Comment 

Estos días he tenido problemillas con el formato de fechas en Java. Resulta que si se le proporciona una fecha que coincida con un cambio de adelanto de hora y que no exista (por ejemplo el 25 de Marzo de 2007 a las 2 de la madrugada) entonces hace la conversión y la transforma a la hora cambiada (es decir, resultaría en el 25 de Marzo de 2007 a las 3 de la madrugada).

Es decir:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date dt = sdf.parse("25/03/2007 02:00:00");
System.out.println(sdf.format(dt));
dt = sdf.parse("25/03/2007 03:00:00");
System.out.println(sdf.format(dt));

Resulta en:

25/03/2007 03:00:00
25/03/2007 03:00:00

Esto es muy molesto si se trabaja con un servidor que proporciona timestamps en UTC, que son independientes de los cambios horarios para el ahorro de energía. Para evitarlo es necesario indicar que se trabajará con fechas de la franja horaria GMT:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
SimpleTimeZone stf = new SimpleTimeZone(0, "GMT");
sdf.setTimeZone(stz);
Date dt = sdf.parse("25/03/2007 02:00:00");
System.out.println(sdf.format(dt));
dt = sdf.parse("25/03/2007 03:00:00");
System.out.println(sdf.format(dt));

Ahora sí:

25/03/2007 02:00:00
25/03/2007 03:00:00

About Pablo

Comments

Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!