2015-06-08 21 views
9

Sto tentando di analizzare: 2014-05-02-10.45.05.993280-5:00 dove lo -5:00 è l'offset da UTC. Utilizzo di un java.time DateTimeFormatter in Java 8.java.time DateTimeFormatter pattern per offset fuso orario

Per il primo bit ho il seguente: yyyy-MM-dd-HH.mm.ss.SSSSSS tuttavia, non riesco a capire quale dovrebbe essere il modello per analizzare anche l'offset.

Se avessi l'offset con 4 cifre (-05: 00) potrei usare: yyyy-MM-dd-HH.mm.ss.SSSSSSxxx, ma questo non funziona per 3 cifre.

Qualche idea?

+1

Quale versione di Java stai usando? –

+0

@JonSkeet - mi spiace, post originale aggiornato. – Cheetah

risposta

9

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ò.

+0

Il pattern non funziona ... ma il link al bug sembra esattamente il mio problema Ho provato il suggerimento del costruttore, ma non sembrava funzionare. – Cheetah

+0

@Cheetah Hai ragione. Mi dispiace che tu soffra del bug. Si prega di consultare anche il mio aggiornamento se è possibile utilizzare uno dei metodi alternativi alternativi. –

2

Offset per SimpleDateFormat segno è Z controllo Java7 o Java8SimpleDateFormat API.

Poi, il formato di parser per String

2014-05-02-10.45.05.993280-5:00 

deve essere:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ 

UPDATE: per DateTimeFormatter l'offset modelli per la formattazione e l'analisi sono:

O  localized zone-offset  offset-O   GMT+8; GMT+08:00; UTC-08:00; 
X  zone-offset 'Z' for zero offset-X   Z; -08; -0830; -08:30; -083015; -08:30:15; 
x  zone-offset     offset-x   +0000; -08; -0830; -08:30; -083015; -08:30:15; 
Z  zone-offset     offset-Z   +0000; -0800; -08:00; 

Il modello desiderato in DateTimeFormatter è X.

+0

Sto usando un 'DateTimeFormatter' e l'aggiunta di una' Z' non sembra funzionare – Cheetah

+1

Sei collegato a Java 7 due volte. [Java 8 API è qui.] (Http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl