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.
Me gusta tu blog, voy a seguir leyendo entradas 😉
Tiene para agregar al RSS? (sí, eso del siglo pasado).
Sí, arriba a la derecha: http://feeds2.feedburner.com/davidvalverde
Buen aporte #compañero 😉
Gracias 🙂
Compañero! Aún queda esperanza con el paseo de fechas usando SimpleDateFormat. Hay que especificar que el paseo debe realizarse siguiendo el patrón estrictamente. O lo que es lo mismo: http://docs.oracle.com/javase/1.5.0/docs/api/java/text/DateFormat.html#setLenient(boolean)
Buen blog, hacia tiempo que no entraba 🙂
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.
Como se encuentra el desarrollo del Software en su país. Por favor responda ya que es de suma importancia.