2014-12-25 18 views
10

Provato per 4 ore per capirlo.Errore di analisi Java LocalDateTime

: Questo funziona

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

: Questo non

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

L'unica differenza è il mese tutto capitalizzati. Il caso corretto di Jul funziona. Né JUL o Jul funzioneranno. Ho anche provato il modello di 'LLL' senza fortuna. Cosa mi manca ??

+0

Java è case sensitive – Evorlor

+0

La risposta di James è corretta. Usa DateTimeFormatterBuilder.parseCaseInsensitive() – JodaStephen

risposta

1

Non sembra supportato dallo official API.

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 

L'unica opzione per il mese-su-anno è lì, e non menziona esplicitamente qualsiasi formato di supporto di tre lettere capitali mesi.

Non è molto difficile convertirlo in un formato che Java può rispettare; coinvolge un pochino di appuntare la data e rimetterla in una singola stringa, però.

La soluzione di seguito non è elegante o pulita come utilizzare una terza parte, ma il vantaggio aggiunto è che non è necessario affidarsi alla libreria di terze parti per questo codice.

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

Grazie. Avrei pensato che i progettisti dell'API avrebbero assegnato una tale variazione comune delle forme del caso. Grazie per il frammento. –

0

M per definizione prende July; Jul; 07. Si potrebbe desiderare di provare (soluzione essendo un po 'brutto):

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)); 

Oppure si può provare a utilizzare WordUtils da apache-commons per capitalize.

11

Bene a quanto pare ho bisogno di passare 5 ore su questo. Durante la scrittura di un'estensione per fornire una soluzione alternativa l'ho scoperto.

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()); 

Funziona alla grande per tutti gli stili di custodie.

+0

Questo dovrebbe essere contrassegnato come la risposta accettata. – navkast

1

Provare a utilizzare DateTimeFormatterBuilder e rendere parser senza distinzione tra maiuscole e minuscole. Non dimenticare di specificare la locale. Altrimenti l'abbreviazione del mese potrebbe non essere analizzata da MMM nelle impostazioni internazionali predefinite:

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

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

'.parseCaseInsensitive()' è ciò di cui avevo bisogno. Grazie. – Basil