Utilizzare la lettera maiuscola X anziché x, quindi XXX. La differenza è che la X grande può riconoscere la lettera di input "Z" come UTC-Offset +00: 00 mentre la lettera X non è possibile.
modello consigliata:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
ricordiamo inoltre di seguire JDK-bug:
java.time.format.DateTimeFormatter non può analizzare un offset con sola ora cifre
AGGIORNAMENTO:
Ho ora testato la soluzione descritta nel registro errori.
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
Ma viene generata un'eccezione:
Exception in thread java.time.format.DateTimeParseException "principale": Testo '2014-05-02-10.45.05.993280-5: 00 'non può essere analizzato all'indice 26 a java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) a java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) su HelloWorld.main (Ciao mondo.java: 16)
Quindi l'analisi parente non aiuta neanche. Così ora ci sono solo tre opzioni a sinistra per voi:
Usa soluzione suggerita da bug giornalista: [...] soluzione è quella di analizzare la data/ora separatamente, utilizzare un parser codificato mano per l'offset e combinare LocalDateTime con lo spostamento dell'aspetto manuale. Non è un lavoro facile in giro.
Provate il vostro preelaborazione di stringhe specializzato. Se si dispone di un formato fisso, è possibile provare a inserire la cifra zero nella posizione 26 (se la lunghezza di input totale è di una cifra troppo piccola).
Oppure si utilizza una libreria esterna che può farlo. La mia libreria Time4J (v4.0) può farlo se sei disposto ad aggiungere una dipendenza extra. Vedere questo codice:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
Aggiornamento: Secondo JDK-bug-status, il bug è stato corretto per Java-9, ma un backport per Java-8 non sembra essere disponibile però.
fonte
2015-06-08 14:05:32
Quale versione di Java stai usando? –
@JonSkeet - mi spiace, post originale aggiornato. – Cheetah