jueves, 27 de febrero de 2014

Pasar de milisegundos a un formato de hora concreto sin errores

Buenas.En un proyecto tenia que calcular cuanto tarda una rutina concreta y mostrar ese tiempo en un formato concreto. Lo que en un principio parecía una tarea sencilla se complico algo más de la cuenta, ya lo veréis.

Para empezar, la forma para contar cuanto dura una tarea es tan fácil como hacer uso de System.currentTimeMillis(), esto te da la hora actual del sistema en milisegundos en un formato long. Se toma al principio y al final de la tarea, y restas la cantidad final de la inicial. Con esto ya tienes cuanto ha tardado una tarea en milisegundos.
long init = System.currentTimeMillis();
....
long end = System.currentTimeMillis();
long time = end - init;

Y con SimpleDateFormat puedes a partir de una fecha sacarla en el formato que quieras (Y una fecha la obtenemos fácilmente a través de una variable long a través del constructor de java.util.Date o con el método setTimeInMillis() de java.util.Calendar). Por ejemplo así:
...
long time = end - init;
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
final SimpleDateFormat sdfParser = new SimpleDateFormat("HH:mm:ss", new Locale("ES"));
String sTime = sdfParser.format(cal.getTime());

Con SimpleDateFormat puedes darle multiples formatos a una fecha tal y como se indica en su documentación oficial.
Hasta aquí todo bien y esto mismo puedes encontrar en cualquier sitio en Internet donde se pregunte como pasar de milisegundos a un formato de fecha. Pero si haceis un ejemplo similar al código que os indico, vereis que el valor de sTime no es el correcto, que por ejemplo en el caso de los españoles, indica una hora más de la deseada. Y esto es así porque el sistema utilizará la zona horaria de donde nos encontremos (en el caso de españa GMT+1). Para solucionar este problema deberemos hacer lo siguiente
...
final SimpleDateFormat sdfParser = new SimpleDateFormat("HH:mm:ss", new Locale("ES"));
sdfParser.setTimeZone(TimeZone.getTimeZone("GMT"));
String sTime = sdfParser.format(cal.getTime());

Desde aquí agradecer a David e Ignacio que me ayudaron en la elaboración de este post ;-)

No hay comentarios:

Publicar un comentario