2014-12-25 8 views
10

Versuchen Sie 4 Stunden lang, dies herauszufinden.Java LocalDateTime Parse Fehler

: Das funktioniert

String date = "Jul-01-2014 09:10:12"; 
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US)); 

: Dies wird nicht

String date = "JUL-01-2014 09:10:12"; 
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US)); 

Der einzige Unterschied ist der Monat alle aktiviert. Der richtige Fall von Jul funktioniert. Weder JUL noch jul werden funktionieren. Ich habe auch Muster von "LLL" ohne Glück versucht. Was vermisse ich??

+0

Java ist Groß- und Kleinschreibung – Evorlor

+0

James' Antwort die richtige ist. Verwenden Sie DateTimeFormatterBuilder.parseCaseInsensitive() – JodaStephen

Antwort

1

Es sieht nicht so aus, dass das von der official API unterstützt wird.

Symbol Meaning      Presentation  Examples 
    ------ -------      ------------  ------- 
    G  era       text    AD; Anno Domini; A 
    u  year      year    2004; 04 
    y  year-of-era     year    2004; 04 
    D  day-of-year     number   189 
    M/L  month-of-year    number/text  7; 07; Jul; July; J 
    d  day-of-month    number   10 

Die einzige Option für Monat-of-Jahr ist da, und es nicht explizit jedes Format unterstützt drei Großbuchstaben Monate nicht erwähnt.

Es ist nicht schrecklich schwierig, es wieder in ein Format zu konvertieren, das Java respektieren kann; es beinhaltet ein kleines bisschen, das Datum zu finalisieren und es in eine einzelne Zeichenfolge zurückzuversetzen.

Die folgende Lösung ist nicht so elegant oder so sauber wie die Verwendung einer dritten Partei, aber der zusätzliche Vorteil ist, dass man sich für diesen Code überhaupt nicht auf die Third-Party-Bibliothek verlassen muss.

public String transformToNormalizedDateFormat(final String input) { 
    String[] components = input.split("-"); 
    String month = components[0]; 
    if(month.length() > 3) { 
     throw new IllegalArgumentException("Was not a date in \"MMM\" format: " + month); 
    } 
    // Only capitalize the first letter. 
    final StringBuilder builder = new StringBuilder(); 
    builder.append(month.substring(0, 1).toUpperCase()) 
      .append(month.substring(1).toLowerCase()) 
      .append("-"); 
    final StringJoiner stringJoiner = new StringJoiner("-"); 
    Arrays.stream(components, 1, components.length).forEach(stringJoiner::add); 
    builder.append(stringJoiner.toString()); 
    return builder.toString(); 
} 
+0

Danke. Ich hätte gedacht, dass die API-Designer für eine solche häufige Variation von Fallformen vorgesehen hätten. Danke für den Ausschnitt. –

0

M per Definition dauert July; Jul; 07. Sie könnten versuchen wollen (Lösung ein wenig hässlich):

date = Character.toUpperCase(date.charAt(0)) + date.substring(1).toLowerCase(); 
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US)); 

Oder Sie können mit WordUtils von apache-commons für capitalize versuchen.

11

Nun, anscheinend musste ich 5 Stunden damit verbringen. Beim Schreiben einer Erweiterung, um eine Problemumgehung bereitzustellen, entdeckte ich dies.

String date = "01-JUL-2014 09:10:12"; 

    DateTimeFormatterBuilder fmb = new DateTimeFormatterBuilder(); 
    fmb.parseCaseInsensitive(); 
    fmb.append(DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm:ss")); 

    LocalDateTime dt = LocalDateTime.parse(date, fmb.toFormatter()); 

Funktioniert gut für alle Fällen Stile.

+0

Dies sollte als akzeptierte Antwort markiert werden. – navkast

1

Verwenden Sie DateTimeFormatterBuilder, und machen Sie Parser von der Groß-/Kleinschreibung unabhängig. Vergessen Sie nicht, das Gebietsschema anzugeben. Ansonsten Monat Abkürzung möglicherweise nicht von MMM in Standardgebietsschema analysiert werden:

DateTimeFormatter format = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendPattern("dd-MMM-yyyy") 
    .toFormatter(Locale.ENGLISH); 

LocalDate.parse("03-jun-2015", format); 
+0

'.parseCaseInsensitive()' ist was ich brauchte. Vielen Dank. – Basil