2017-05-17 3 views
-1

Wir haben ein Client senden Datum an uns im String-Format als "2017-06-14T04:00:00-08:00". Wir müssen es in JAVA Date Typ konvertieren, bevor Sie damit arbeiten.Parse Zeichenfolge bis zum aktuellen Datum mit Zeitzone Offset intakt

Wir auf diese Weise das Parsen:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); 
dateParsedFromString = formatter.parse("2017-06-14T04:00:00-08:00"); 

Aber wir verlieren die nach diesem Parse-Offset. Wenn wir es zurück zu String konvertieren wir sehen, Wert:

2017-06-14T08: 00: 00-04: 00

Wie kann ich von String zu Date in JAVA konvertieren, ohne die sich wandelnde Offset?

+0

Mögliches Duplikat [Wie in Python Daten mit -0400 Zeitzone Zeichenfolge analysieren?] (Http://stackoverflow.com/questions/1101508/how-to-parse-dates-with -0400-timezone-string-in-python) –

+4

@MarioSantini Wie kann eine Antwort auf Phyton eine Frage in Java sein? – Jens

+0

@Jens Sie hatten Recht, sorry, ich vermisse nur die Links, schauen Sie hier http://StackOverflow.com/Questions/4203718/Converting-String-To-Date-with-timezone ist ein Java Anser, konnte nicht sein markiert als Antwort wird nicht akzeptiert. –

Antwort

1

java.util.Date speichert keine Zeitzoneninformationen.

Um die Zeitzone beizubehalten, verwenden Sie ZonedDateTime oder OffsetDateTime (Java 8+).

Da Ihre Datumszeichenfolge ISO 8601 ist, müssen Sie nicht einmal ein Datumsformat angeben.

ZonedDateTime zdt = ZonedDateTime.parse("2017-06-14T04:00:00-08:00"); 
System.out.println(zdt); // prints: 2017-06-14T04:00-08:00 
OffsetDateTime odt = OffsetDateTime.parse("2017-06-14T04:00:00-08:00"); 
System.out.println(odt); // prints: 2017-06-14T04:00-08:00 
+0

Während 'ZonedDateTime' technisch funktioniert, ist 'OffsetDateTime' angemessen. Eine Zeitzone ist eine Historie von Offset-Änderungen, die von einer bestimmten Region verwendet werden. –

+0

@BasilBourque Die Verwendung von 'ZonedDateTime' ist absolut gültig, da' -08: 00' eine gültige Zeitzone ist. Die Zeitzone ist eine Obermenge der Zonenverschiebung, oder besser gesagt: ['ZoneOffset'] (https://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html) ist eine Unterklasse (Einschränkung) von 'ZoneId'. – Andreas

+0

Warum haben wir dann die 'OffsetDateTime' Klasse? Und nein, "-08: 00" ist * keine * Zeitzone. 'America/Los_Angeles' ist eine Zeitzone. Diese Zone hat einen Offset von "-08: 00" und "-07: 00" in einem anderen Teil des Jahres. Diese Änderungen des Offsets im Laufe der Zeit, ihre Historie in der Vergangenheit, der aktuelle Offset zu diesem Zeitpunkt und die geplanten Offset-Änderungen in der Zukunft, dass die * Offsets-Sammlung * für diese eine Region eine Zeitzone ist. Daher ist die Verwendung von "ZonedDateTime" in dieser Antwort irreführend, verwirrend und für die Eingabedaten nicht geeignet. Sonst gut Antwort, wenn Sie "ZonedDateTime" löschen. –

Verwandte Themen