2013-02-13 3 views
12

Quando eseguo il codice seguente mi aspetto uno stacktrace, ma invece sembra che ignori la parte difettosa del mio valore , perché succede?Perché le date di analisi SimpleDateFormat non-lenient sono con lettere in?

package test; 

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

public class Test { 
    public static void main(final String[] args) { 
    final String format = "dd-MM-yyyy"; 
    final String value = "07-02-201f"; 
    Date date = null; 
    final SimpleDateFormat df = new SimpleDateFormat(format); 
    try { 
     df.setLenient(false); 
     date = df.parse(value.toString()); 
    } catch (final ParseException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(df.format(date)); 
    } 

} 

L'output è:

07-02-0201

risposta

10

La documentazione di DateFormat.parse (che viene ereditato dalla SimpleDateFormat) dice:

The method may not use the entire text of the given string. 

Nel tuo caso (201f) è stato in grado di analizzare la stringa valida fino al 201, ecco perché non ti dà alcun errore.

La "Genera" sezione dello stesso metodo è definito come di seguito:

ParseException - if the beginning of the specified string cannot be parsed 

Quindi, se si prova a cambiare la stringa di

final String value = "07-02-f201"; 

si otterrà l'eccezione parse , poiché l'inizio della stringa specificata non può essere analizzato.

1

Confermato ... Ho anche trovato che "07-02-201", "07-02-2012 è la data" compila. Tuttavia, "bar07-02-2011" no.

Dal codice in SimpleDateFormat, sembra che l'analisi termini nel momento in cui viene trovato un carattere illegale che interrompe la corrispondenza. Tuttavia, se la stringa che è già stata analizzata fino a quel punto è valida, viene accettata.

4

È possibile controllare se l'intera stringa è stata analizzata come segue.

ParsePosition position = new ParsePosition(0); 
    date = df.parse(value, position); 
    if (position.getIndex() != value.length()) { 
     throw new ParseException("Remainder not parsed: " 
       + value.substring(position.getIndex())); 
    } 

Inoltre quando un'eccezione è stata generata dal parse il position sarà anche cedere getErrorIndex().