2015-02-04 6 views
9

Wenn ein Monat in UPPER oder in Kleinbuchstaben ist, d. H. Nicht im Titel, kann DateTimeFormatter das Datum nicht analysieren. Gibt es eine einfache Möglichkeit, ein Datum in einen Titel umzuwandeln oder den Formatierer etwas milder zu machen?Wie behandelt man Groß- oder Kleinschreibung in JSR 310?

for (String date : "15-JAN-12, 15-Jan-12, 15-jan-12, 15-01-12".split(", ")) { 
    try { 
     System.out.println(date + " => " + LocalDate.parse(date, 
            DateTimeFormatter.ofPattern("yy-MMM-dd"))); 
    } catch (Exception e) { 
     System.out.println(date + " => " + e); 
    } 
} 

druckt

15-JAN-12 => java.time.format.DateTimeParseException: Text '15-JAN-12' could not be parsed at index 3 
15-Jan-12 => 2015-01-12 
15-01-12 => java.time.format.DateTimeParseException: Text '15-01-12' could not be parsed at index 3 
15-jan-12 => java.time.format.DateTimeParseException: Text '15-jan-12' could not be parsed at index 3 

Antwort

19

DateTimeFormatter s sind streng und Groß- und Kleinschreibung standardmäßig. Verwenden Sie DateTimeFormatterBuilder und geben Sie parseCaseInsensitive() an, um die Groß-/Kleinschreibung nicht zu analysieren.

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendPattern("yy-MMM-dd") 
    .toFormatter(Locale.US); 

zu können numerische Monate analysieren (dh. "15-01-12"), müssen Sie auch parseLenient() angeben.

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .parseLenient() 
    .appendPattern("yy-MMM-dd") 
    .toFormatter(Locale.US); 

Sie können auch nur den Monat Teil als Groß- und Kleinschreibung/nachsichtig ausführlicher zu spezifizieren sein:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .appendPattern("yy-") 
    .parseCaseInsensitive() 
    .parseLenient() 
    .appendPattern("MMM") 
    .parseStrict() 
    .parseCaseSensitive() 
    .appendPattern("-dd") 
    .toFormatter(Locale.US); 

Theoretisch dies schneller sein könnte, aber ich bin nicht sicher, ob es ist.

PS: Wenn Sie parseLenient() vor dem Jahr Teil angeben, wird es auch 4-stellige Jahre analysiert (dh "2015-JAN-12".) Richtig.

+2

@hraldK Wenn '.parseLenient()' nicht gesetzt ist, schlägt das Format "15-01-12" fehl. – SubOptimal

Verwandte Themen