2016-05-16 21 views
5

Ich versuche, Java 8 neue Datum Muster statt Joda zu verwenden, und ich habe folgendes Problem:Java 8 Local ZonedDateTime kann nicht mit Zeitzone analysieren Datum

Beide

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z")) 

und

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z")) 

werfen 'java.time.format.DateTimeParseException' Ausnahme. Während

org.joda.time.DateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormat.forPattern("dd/MM/yy HH:mm.ss.SSS Z")) 

funktioniert gut.

Ursache der Ausnahme ist:

java.time.format.DateTimeParseException: Text '02/05/16 11: 51.12.083 +04: 30' nicht am Index 22

geparst werden könnte

Mache ich etwas falsch?

+2

Haben Sie OffsetDateTime versucht? Es enthält nicht genügend Informationen, um eine tatsächliche Zeitzone zu kennen. alles, was es trägt, ist der Offset von UTC. –

+0

Obwohl aus dem Beispiel in der [docs] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) scheint Doppelpunkt als Zone Offset Delimeter aber akzeptiert Wenn Sie es versuchen, löst es die Ausnahme aus. Wenn Sie nur den Doppelpunkt entfernen, sollte es funktionieren. Ihre Datetime-Zeichenkette sollte also '02/05/16 11: 51.12.083 + 0430' sein. –

+0

@Hank DI hat versucht, diese OffsetDateTime.parse ("02/05/16 11: 51.12.083 +04: 30", DateTimeFormatter.ofPattern ("TT/MM/JJ HH: mm.ss.SSS Z")) aber ich bekomme immer noch die selbe Ausnahme. – ampofila

Antwort

5

Wenn Sie lesen the javadoc of DateTimeFormatter, erhalten Sie einen Abschnitt finden detailliert, wie die Z verwenden Offset (Hervorhebung von mir):

Offset Z: Dies formatiert den Offset basierend auf der Anzahl der Musterbuchstaben. Ein, zwei oder drei Buchstaben geben die Stunde und die Minute aus, ohne einen Doppelpunkt wie "+0130". Der Ausgang wird '+0000' sein, wenn der Offset Null ist. Vier Buchstaben geben die vollständige Form des lokalisierten Offsets aus, was vier Buchstaben von Offset-O entspricht. Die Ausgabe ist der entsprechende lokalisierte Offset-Text, wenn der Offset Null ist. Fünf Buchstaben geben die Stunde, Minute aus, mit optionaler Sekunde, wenn nicht Null, mit Doppelpunkt. Es gibt 'Z' aus, wenn der Offset Null ist. Sechs oder mehr Buchstaben lösen IllegalArgumentException aus.

Also mit 5 Z s wird wie erwartet:

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", 
        DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS ZZZZZ")); 

Beachten Sie, dass ähnliche Ergebnisse mit erhalten:

  • z
  • zz
  • zzz
  • zzzz
  • xxx
  • XXX
  • xxxxx
  • XXXXX
0

Sie müssen XXX für den Zonenoffset verwenden. Dies funktioniert für ZonedDateTime und OffsetDateTime

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

Es mit LocalDateTime auch analysieren, aber die Zone abgeschnitten werden ausgeglichen.

+0

Ich habe das versucht, immer noch die selbe Ausnahme. (ZonedDateTime.parse ("02/05/16 11: 51.12.083 +04: 30", DateTimeFormatter.ofPattern ("TT/MM/JJ HH: mm.ss.SS X"))) – ampofila

1

fand ich die Antwort in diesem Beitrag Unparsable Date with colon-separated timezone

Um einen Zeitstempel zu analysieren, die eine Zeitzone mit einem Semikolon trägt anstelle von X oder Z als der DateFormatter javadoc gibt, Sie XXX verwenden müssen. Alle folgende Arbeiten:

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 
0

DateTimeFormatterBuilder Verwendung zur exakten Steuerung des Parsers zu erhalten und mit appendOffsetId Werke:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendValue(ChronoField.DAY_OF_MONTH, 2) 
     .appendLiteral('/') 
     .appendValue(ChronoField.MONTH_OF_YEAR, 2) 
     .appendLiteral('/') 
     .appendValueReduced(ChronoField.YEAR, 2, 2, 2000) 
     .appendLiteral(' ') 
     .appendValue(ChronoField.HOUR_OF_DAY) 
     .appendLiteral(':') 
     .appendValue(ChronoField.MINUTE_OF_HOUR) 
     .appendLiteral('.') 
     .appendValue(ChronoField.SECOND_OF_MINUTE) 
     .appendLiteral('.') 
     .appendValue(ChronoField.MILLI_OF_SECOND) 
     .appendLiteral(' ') 
     .appendOffsetId() 
     .toFormatter(); 

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", formatter);