2016-02-09 8 views
6

erhalten, wenn ich dies tunkann nicht OffsetDateTime von TemporalAccessor

String datum = "20130419233512"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin")); 
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter); 

ich die folgende Ausnahme erhalten:

java.time.format.DateTimeParseException: Text '20130419233512' could not be parsed: 
Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1366407312},ISO,Europe/Berlin resolved 
to 2013-04-19T23:35:12 of type java.time.format.Parsed 

Wie kann ich meine Datetime-Zeichenfolge zu analysieren, so dass es wie immer zu sein von der interpretiert wird Zeitzone "Europa/Berlin"?

Antwort

6

Das Problem ist, dass es einen Unterschied gibt zwischen dem, was ein ZoneId ist und ein ZoneOffset ist. Um einen OffsetDateTime zu erstellen, benötigen Sie einen Zonen-Offset. Aber there is no one-to-one mapping between a ZoneId and a ZoneOffset weil es tatsächlich auf die aktuelle Sommerzeit ankommt. Für den gleichen ZoneId wie "Europa/Berlin" gibt es einen Offset für den Sommer und einen anderen Offset für den Winter.

Für diesen Fall wäre es einfacher, eine ZonedDateTime anstelle einer OffsetDateTime zu verwenden. Während Parsing wird die ZonedDateTime korrekt an die "Europe/Berlin" Zone-ID eingestellt werden und die auch nach dem Tageslicht versetzt wird einige Zeit in der Tat für das Datum eingestellt werden Speicher zu analysieren:

public static void main(String[] args) { 
    String datum = "20130419233512"; 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin")); 
    ZonedDateTime datetime = ZonedDateTime.parse(datum, formatter); 

    System.out.println(datetime.getZone()); // prints "Europe/Berlin" 
    System.out.println(datetime.getOffset()); // prints "+02:00" (for this time of year) 
} 

Beachten Sie, dass, wenn Sie wirklich ein OffsetDateTime wollen Sie können ZonedDateTime.toOffsetDateTime() verwenden, um eine ZonedDateTime in eine OffsetDateTime umzuwandeln.

+2

Ich mag, dass Sie dies in einem Schritt tun, anstatt in zwei, wie ich gezeigt habe. Ich werde meine Antwort hinterlassen, da beide funktionieren, aber ich würde Ihre für das grüne Häkchen empfehlen. :) –

+0

Da ich OffsetDateTime brauche, verwende ich jetzt 'OffsetDateTime datetime = ZonedDateTime.parse (Datum, Formatierer) .toOffsetDateTime();'. – asmaier

+1

@asmaier Ja, das habe ich auch kommentiert. Sie können das verwenden, um zu einer 'OffsetDateTime' zu ​​konvertieren. – Tunaki

1

In Ihren Quelldaten ist kein Offset enthalten. Daher ist OffsetDateTime nicht der richtige Typ für die Analyse.

Verwenden Sie stattdessen eine LocalDateTime, da dies der Typ ist, der den Daten, die Sie haben, am ähnlichsten ist. Verwenden Sie dann atZone, um ihm eine Zeitzone zuzuweisen, und wenn Sie noch eine OffsetDateTime benötigen, können Sie von dort aus toOffsetDateTime aufrufen.

String datum = "20130419233512"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
LocalDateTime datetime = LocalDateTime.parse(datum, formatter); 
ZonedDateTime zoned = datetime.atZone(ZoneId.of("Europe/Berlin")); 
OffsetDateTime result = zoned.toOffsetDateTime(); 
+0

Danke. Das ist für mich in Ordnung. Ich nahm irgendwie an, dass die OffsetDateTime.parse() Methode diese Schritte intern für mich tun würde. – asmaier