Problema con SimpleDateFormat

316 views
Skip to first unread message

fjtorres

unread,
Apr 20, 2009, 4:21:24 AM4/20/09
to JavaSOS
Hola amig@s,

tengo un problema muy raro con el SimpleDateFormat. Le paso el pattern
"dd/MM/yyyy" y la fecha erronea "10/12/2a9a" y me lo devuelve como
correcto, no salta excepcion de formato. La verdad es muy extraño. Si
alguien me puede dar una explicación de lo que pongo mal se lo
agradeceria.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Main
{

/**
* Método Main para pruebas.
* @param args
*/
public static void main(String[] args)
{
SimpleDateFormat formatea = new SimpleDateFormat("dd/MM/
yyyy");
try
{
formatea.setLenient(false);
Date fechaForm = formatea.parse("10/12/2a9a");
}
catch (ParseException e)
{
System.out.println("Error, la cadena de texto no se puede
convertir en fecha.");
}
}

}

Raúl Contreras

unread,
Apr 20, 2009, 4:31:38 AM4/20/09
to jav...@googlegroups.com
Prueba NullPointerException en ves de ParseException. 
Según la documentación,  el método parse del SimpleDateFormat no arroja en ningún momento un ParseException.


Saludos.


 
--
Raúl Contreras
Murcia, España

fjtorres

unread,
Apr 20, 2009, 5:24:27 AM4/20/09
to JavaSOS
Muchas gracias por contestar.

El problema es que no salta ninguna excepción, genera una fecha con el
día 10 de diciembre del año 2.

Por cierto el método si arroja ParseException, el método al que haces
referencia es distinto al que uso yo.

http://java.sun.com/javase/6/docs/api/java/text/DateFormat.html#parse(java.lang.String)

Saludos.

Favio DeMarco

unread,
Apr 20, 2009, 8:00:38 AM4/20/09
to jav...@googlegroups.com
Leé el método subParse de SimpleDateFormat.
Eso es porque por defecto utiliza DecimalFormat, que por defecto
ignora los caracteres no numéricos.

"parsing does not necessarily use all characters up to the end of the string"
"DecimalFormat parses all Unicode characters that represent decimal
digits, as defined by Character.digit()."
http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html#parse(java.lang.String,%20java.text.ParsePosition)

Podés cambiarlo usando setNumberFormat
http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html#setNumberFormat(java.text.NumberFormat)

2009/4/20 fjtorres <kisc...@gmail.com>:

Claudio Fernandez

unread,
Apr 20, 2009, 4:46:53 PM4/20/09
to jav...@googlegroups.com
Peroooooooo... no tiene sentido esperar una NullPointerException

Yo intentaría lo que dijo Favio, cambiando el NumberFormatter del SimpleDateFormat por uno que solo interprete caracteres numericos como numeros. Pero la verdad no se. Curiosa cosa!

2009/4/20 Raúl Contreras <raul.contr...@gmail.com>

Raúl Contreras

unread,
Apr 21, 2009, 3:20:08 AM4/21/09
to jav...@googlegroups.com
Realmente es raro el comportamiento del  .parse() con respecto al año cuando va al final de la cadena.

ya que si en:

Date fechaForm = formatea.parse("10/12/2a9a");
cambias por 1a9a, 0a9a, 9a9a,8a9a te devuelve el año que corresponde al primer número . Mas si cambias el inicio del año por una letra en vez de número si funciona de la manera correcta.

se me ocurren 2 cosas:

-Lo que haría primero es formatear el texto y luego formatear la fecha. uno para ver si efectivamente son números todos los campos y otro para ver que fecha es.

o

- modificar el pattern como introduces la fecha( si tienes oportunidad). si en vez de utilizar el "dd/MM/yyyy" lo haces  como  "yyyy/MM/dd" o "yyyy-MM-dd" si funcionará tu código y validará bien los años.

saludos.

Bernardo

unread,
Apr 21, 2009, 7:46:43 AM4/21/09
to JavaSOS
Creo que tiene un booleano Lenient, que chequea que sea exacto o algo
asi. Creo que deberias ponerle setLenient(true)

Probá con eso y contanos.

Claudio Fernandez

unread,
Apr 21, 2009, 1:11:28 PM4/21/09
to jav...@googlegroups.com
El Lenient es del Calendar y sirve para si sumas... no se, 45 días a una fecha sea lo mismo que sumarle 15 días y 1 mes.

Pero creo que nada que ver con esto... creo

2009/4/21 Bernardo <bfa...@gmail.com>

fjtorres

unread,
Apr 22, 2009, 2:11:30 AM4/22/09
to JavaSOS
Gracias por las respuestas,

el lenient ya lo use pero no soluciono nada. En cuanto a lo de cambiar
el numberformat no lo probé bien (aun), por ahora lo que hice fue
validar primero la entrada con patterns y si eso es correcto validar
la fecha con el simpledateformat. La verdad es muy extraño ese
comportamiento en el simpledateformat, es mas lo había usado antes
muchas veces y jamas me había fijado en este detalle.

Saludos.

David Castañeda

unread,
Apr 22, 2009, 7:35:31 AM4/22/09
to jav...@googlegroups.com
Bueno después de tanta discusión sobre el asunto, me dió por darle un vistazo al codigo del JDK en SimpleDateFormat y la verdad que no encuentro que en ninguna parte del código donde utiliza lenient, en mi opinión la implementación de SimpleDateFormat simplemente ignora esta propiedad :S, revise mas el tema y no encontré bugs al respecto asi que 2 cosas:

1. Quitate el problema de encima utilizando JodaTime, que de cualquier forma es algo que te va a quitar mas dolores de cabeza si estas utilizando fechas :). este código funciona y el formateador es thread safe.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
DateTime dateTime = formatter.parseDateTime("10/12/2a9a");
Date date = dateTime.toDate(); //nunca porque la l'inea anterior arroja exception

2. En los comentarios de esta pagina http://www.magpiebrain.com/blog/2004/05/17/beware-using-dateformat-for-input-validation/ alguién colocó una solución por si no puedes utilizar JodaTime. Lo raro es que el que escribió el post dice que lo solucionó con setLenient !! :S !!


Suerte.



2009/4/22 fjtorres <kisc...@gmail.com>



--
David Castañeda R.

Bernardo

unread,
Apr 22, 2009, 7:56:01 AM4/22/09
to JavaSOS
http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html#setLenient(boolean)

setLenient

public void setLenient(boolean lenient)

Specify whether or not date/time parsing is to be lenient. With
lenient parsing, the parser may use heuristics to interpret inputs
that do not precisely match this object's format. With strict parsing,
inputs must match this object's format.

Parameters:
lenient - when true, parsing is lenient

-----------------------------------------------
Yo le daria una probada a esto de todas maneras, creo haberlo
utilizado alguna vez, por eso fue que me vino a la mente.

fav

unread,
Apr 23, 2009, 1:19:06 PM4/23/09
to JavaSOS
Reply all
Reply to author
Forward
0 new messages