Desarrollo de Software

¡Cuidado al formatear fechas en Java!

Cuando estemos formateando un String con alguna clase hija de Format hay que tener cuidado porque puede producirse un efecto no deseado. Lo he comprobado con la clase SimpleDateFormat, aunque también se da con DecimalNumberFormat y seguramente con alguna más.

El problema es que al intentar formatear la cadena de caracteres, si encuentra el patrón buscado al comienzo del String, para de realizar el parseo aunque tenga más caracteres detrás. Esto puede ser un problema en determinadas circunstancias.

Por ejemplo, en este caso para las fechas:

String pattern = “yyyyMMdd”;
String dateIn = “2012119f”;
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date date = format.parse(dateIn);

se parsearía correctamente obteniendo la fecha del 9 de noviembre de 2012. Un caso parecido ocurre al parsear números decimales como puede verse en el enlace de más arriba.

Para comprobar que el parseo del String se hace completo, puedes utilizar la clase ParsePosition de este modo:

String pattern = “yyyyMMdd”;
String dateIn = “2012119f”;
SimpleDateFormat format = new SimpleDateFormat(pattern);
ParsePosition parsePosition = new ParsePosition(0);
Date date = format.parse(dateIn, parsePosition);
if (parsePosition.getIndex() == dateIn.length()) {
	// El parseo se ha realizado correctamente
} else {
	// Ha fallado el parseo
}

En la línea 4 se inicializa la clase ParsePosition con el índice en 0 y en la siguiente se le pasa al método parse. En la sexta línea se utiliza getIndex() para comprobar dónde ha quedado el índice de parseo y si coincide con la longitud de la cadena es que el parseo se ha realizado correctamente con todos los caracteres del String.

7 comentarios en “¡Cuidado al formatear fechas en Java!

    • Gracias Paco, voy a intentar darle caña de nuevo al blog que lo tenía un poco abandonado.

      Sobre el método setLenient(), sí, corrige otro posible efecto no deseado al parsear fechas como cuando pones el 32 de enero y te devuelve una fecha con 1 de febrero, pero ¿resuelve el caso en el que estamos hablando en el post?

      Por ejemplo, si ponemos el String de entrada como:

      String dateIn = "20121110zorreraparda";

      te realizaría bien el parseo y devolvería el 10 de noviembre de 2012. Para que avisara que el String de entrada no es correcto estrictamente, habría que utilizar la clase ParsePosition.

Pon un comentario

Tu dirección de email no será publicada.

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>