2015-06-08 12 views
9

Ich versuche zu analysieren: 2014-05-02-10.45.05.993280-5:00 wo der -5:00 ist der Offset von UTC. Mit einem java.time DateTimeFormatter in Java 8.java.time DateTimeFormatter Muster für Zeitzone Offset

Für das erste Bit habe ich folgendes: yyyy-MM-dd-HH.mm.ss.SSSSSS jedoch kann ich nicht herausfinden, was das Muster sein sollte, um den Offset auch zu analysieren.

Wenn ich den Offset mit 4 Ziffern (-05: 00) hätte, könnte ich verwenden: yyyy-MM-dd-HH.mm.ss.SSSSSSxxx, aber dies funktioniert nicht für 3 Ziffern.

Irgendwelche Ideen?

+1

Welche Java-Version verwenden Sie? –

+0

@JonSkeet - Entschuldigung, aktualisiert ursprünglichen Beitrag. – Cheetah

Antwort

9

Verwenden Sie den Großbuchstaben X anstelle von x, also XXX. Der Unterschied besteht darin, dass das große X den Eingangsbuchstaben "Z" als UTC-Offset +00: 00 erkennen kann, während der kleine Musterbuchstabe X dies nicht kann.

Vorgeschlagene Muster:

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

Bitte beachten Sie auch folgende JDK-bug:

java.time.format.DateTimeFormatter kann ein nicht analysieren Offset mit einzelnen digit Stunde

UPDATE:

Ich habe jetzt die beschriebene Problemumgehung im Bug-Log getestet.

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

Aber es gibt eine Ausnahme aus:

Exception in thread "main" java.time.format.DateTimeParseException: Text ‚2014-05-02-10.45.05.993280-5: 00 'konnte nicht bei Index 26 bei java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) bei java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) bei HelloWorld.main geparst werden (Hallo Welt.java: 16)

So mildes Parsing hilft auch nicht. So gibt es jetzt nur noch drei Optionen, die für Sie:

  • Verwenden Abhilfe durch Bug Reporter vorgeschlagen: [...] Abhilfe ist, das Datum/Zeit getrennt zu analysieren, eine Hand codiert Parser für den Offset verwenden und kombinieren Sie LocalDateTime mit dem von Hand geparsten Offset. Keine leichte Aufgabe.

  • Versuchen Sie Ihre eigene spezialisierte String-Vorverarbeitung. Wenn Sie ein festes Format haben, können Sie versuchen, die Nullstelle an Position 26 einzufügen (wenn die Gesamteingabedauer eine Ziffer zu klein ist).

  • Oder Sie verwenden eine externe Bibliothek, die dies tun kann. Meine Bibliothek Time4J (v4.0) kann das tun, wenn Sie bereit sind, eine zusätzliche Abhängigkeit hinzuzufügen. Sehen Sie diesen Code:

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

Update: Laut JDK-bug-Status hat sich der Fehler für Java-9 behoben worden, aber ein Backport für Java-8 scheint nicht zu sein verfügbar obwohl.

+0

Das Muster funktioniert nicht ... aber der Link zum Bug sieht genau wie mein Problem aus. Ich habe den Builder-Vorschlag ausprobiert, aber das schien auch nicht zu funktionieren. – Cheetah

+0

@Cheetah Sie haben Recht. Sorry, dass du unter dem Bug leidest. Bitte beachten Sie auch mein Update, wenn Sie eine der alternativen Problemumgehungen verwenden können. –

2

Offset für SimpleDateFormat Zeichen ist Z Scheck Java7 oder Java8SimpleDateFormat API.

Dann Ihr Parser-Format für String

2014-05-02-10.45.05.993280-5:00 

muss sein:

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

UPDATE: für DateTimeFormatter die Offset-Muster für die Formatierung und Parsing sind:

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; 

Ihr gewünschtes Muster in DateTimeFormatter ist X.

+0

Ich verwende einen 'DateTimeFormatter' und das Hinzufügen eines' Z' wird nicht angezeigt. – Cheetah

+1

Sie haben zweimal mit Java 7 verbunden. [Java 8 API ist hier.] (Http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl

Verwandte Themen