2011-08-01 17 views
14

Estoy intentando usar SimpleDateFormat de Java para analizar una cadena hasta la fecha con el siguiente código.Java SimpleDateFormat devuelve un resultado inesperado

public class DateTester { 

    public static void main(String[] args) throws ParseException { 
     String dateString = "2011-02-28"; 

     SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); 

     System.out.println(dateFormat.parse(dateString)); 
    } 
} 

Esperaba un error de análisis. Pero curiosamente, imprime la siguiente cadena.

Wed Jul 02 00:00:00 IST 195 

No se pudo razonar. ¿Alguien puede ayudar?

Gracias

Respuesta

21

SimpleDateFormat ha analizado como 2011meses número 2011, debido meses (MM) es la primera parte del patrón de fecha.

Si añade 2011 meses a años 28, se obtiene el año 195.

2011 mes es de 167 años y 7 meses. Julio es el 7mo mes. Usted especificó 02 como el día, 28 como el año, 28 + 167 = 195, por lo que 02 July 195 es correcto.

+0

+1 para explicar por qué la salida es: 'Wed Jul 02 00:00:00 IST 195' –

+1

+1 Al wombat para una gran explicación. – mre

5

llamada setLenient(false) en el dateFormat. A continuación, obtendrá su excepción de análisis, así:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy") 
===> [email protected] 
groovy:000> df.setLenient(false) 
===> null 
groovy:000> df.parse("2011-02-28") 
ERROR java.text.ParseException: 
Unparseable date: "2011-02-28" 
     at java_text_DateFormat$parse.call (Unknown Source) 
     at groovysh_evaluate.run (groovysh_evaluate:2) 
     ... 

Bohemia es correcto, si no se establece la propiedad indulgente entonces el JDK se esforzará al revés hacer sentido de la basura que se le da:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy"); 
===> [email protected] 
groovy:000> df.parse("13-01-2011") 
===> Sun Jan 01 00:00:00 CST 2012 
groovy:000> df.setLenient(false) 
===> null 
groovy:000> df.parse("13-01-2011") 
ERROR java.text.ParseException: 
Unparseable date: "13-01-2011" 
     at java_text_DateFormat$parse.call (Unknown Source) 
     at groovysh_evaluate.run (groovysh_evaluate:2) 
     ... 
+4

hes no preguntando cómo solucionarlo, él está preguntando por qué hay impresiones que salen y no una excepción de análisis – RMT

+1

@RMT: sí, lo sé, edité mi respuesta para reconocer eso, luego lo cambié para responder a su pregunta. –

21

Por defecto, SimpleDateFormat es indulgente, así que para llegar a fallar, lo que necesita hacer:

dateFormat.setLenient(false) ; 

antes de la fecha de análisis. A continuación, recibirá la excepción:

java.text.ParseException: Unparseable date: "2011-02-28" 
+5

+1 para responder a la pregunta – RMT

+1

@RMT no responde la pregunta. No hay nada de malo con el contenido de la respuesta, información bastante útil (thx @tim), pero la pregunta era "por qué esa salida", no "cómo solucionarla" – Bohemian

+2

En realidad, quería saber "por qué hay esa salida en lugar de una excepción". Entonces, la razón para esto es que setLenient se establece en verdadero, en lugar de falso. Para una respuesta perfecta, ¡debes unir tus dos respuestas! ;). – crusam

Cuestiones relacionadas