Ich habe SimpleDateFormat Konstruktor als
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
und ich analysiere String "2013-09-29T18:46:19Z".
Ich habe gelesen, dass hier Z die GMT/UTC
Zeitzone darstellt. Wenn ich dieses Datum jedoch auf der Konsole drucke, wird IST timezne für das zurückgegebene Datum gedruckt.
Meine Frage ist nun, ob meine Ausgabe richtig oder falsch ist.
java
date
timezone
date-format
simpledateformat
Pradip Borde
quelle
quelle
Antworten:
Sie haben nicht festgelegt, dass die Zeitzone nur
Z
am Ende des Datums / der Uhrzeit ein a hinzugefügt hat. Sie sieht also wie ein GMT-Datum / eine GMT-Uhrzeit aus, ändert jedoch nichts am Wert.Stellen Sie die Zeitzone auf GMT ein und es wird korrekt sein.
quelle
'T'
und'Z'
werden hier als Konstanten betrachtet. Sie müssenZ
ohne die Anführungszeichen bestehen. Außerdem müssen Sie die Zeitzone in der Eingabezeichenfolge angeben.Beispiel:
2013-09-29T18:46:19-0700
Und das Format als"yyyy-MM-dd'T'HH:mm:ssZ"
quelle
-0700
ist die Zeitzone dh -7: 00 UhrVom ISO 8601-String zum Java-Datumsobjekt
Wenn Sie nicht einstellen
TimeZone.getTimeZone("GMT")
, wird es ausgegebenSun Sep 29 18:46:19 CST 2013
Vom Java-Datumsobjekt zum ISO 8601-String
Verwenden Sie zum Konvertieren von
Date
Objekten in ISO 8601 Standard (yyyy-MM-dd'T'HH:mm:ss'Z'
) den folgenden CodeBeachten Sie auch, dass ohne
' '
bei Zyyyy-MM-dd'T'HH:mm:ssZ
druckt2015-01-22T03:41:02+0000
quelle
Wenn Sie die ' Standard' -JSON-Darstellung des Datums verarbeiten möchten, verwenden Sie dieses Muster besser :
"yyyy-MM-dd'T'HH:mm:ssX"
.Beachten Sie das
X
am Ende. Es werden Zeitzonen im ISO 8601-Standard behandelt , und ISO 8601 ist genau das, was diese Aussage in Javascript erzeugtnew Date().toJSON()
Im Vergleich zu anderen Antworten hat es einige Vorteile:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
quelle
play
die automatische Formularbindung und verwende@Format.DateTime
Anmerkungen. Standardmuster mitZ
am Ende verwenden scheint falsch zu sein. Nach dem Wechsel zuX
funktioniert es. Vielen Danktl; dr
Die anderen Antworten sind ab Java 8 veraltet.
ISO 8601
Ihr Zeichenfolgenformat entspricht zufällig der Norm ISO 8601 . Diese Norm definiert sinnvolle Formate für die Darstellung verschiedener Datums- und Uhrzeitwerte als Text.
java.time
Die alten Klassen
java.util.Date
/.Calendar
undjava.text.SimpleDateFormat
wurden durch das in Java 8 und höher integrierte Java.time-Framework ersetzt. Siehe Tutorial . Vermeiden Sie die alten Klassen, da sie sich als schlecht gestaltet, verwirrend und problematisch erwiesen haben.Ein Teil des schlechten Designs in den alten Klassen hat Sie gebissen, wo die
toString
Methode die aktuelle Standardzeitzone der JVM anwendet, wenn eine Textdarstellung des Datums- / Uhrzeitwerts generiert wird, der tatsächlich in UTC (GMT) ist. gut gemeint, aber verwirrend.Die java.time-Klassen verwenden standardmäßig ISO 8601-Formate, wenn Textdarstellungen von Datums- und Uhrzeitwerten analysiert / generiert werden. Sie müssen also kein Analysemuster angeben.
Ein
Instant
ist ein Moment auf der Timeline in UTC .Sie können nach Bedarf eine Zeitzone anwenden , um ein
ZonedDateTime
Objekt zu erstellen .quelle
und wenn Sie nicht die Option haben, auf Java8 zu gehen, verwenden Sie besser 'JJJJ-MM-TT'T'HH: MM: SSX XX ', da dies wieder korrekt analysiert wird (während dies mit nur einem X möglicherweise nicht der Fall ist. .. abhängig von Ihrer Parsing-Funktion)
X erzeugt: +01
XXX generiert: +01: 00
quelle
Für Java 8: Sie können Inbuilt verwenden
java.time.format.DateTimeFormatter
, um die Wahrscheinlichkeit von Tippfehlern wie zISO_ZONED_DATE_TIME
2011-12-03T10:15:30+01:00[Europe/Paris]
ist eines der gebündelten Standardformate für DateTime, die von Oracle Link bereitgestellt werdenquelle