Java SimpleDateFormat ("JJJJ-MM-TT'T'HH: MM: SS 'Z'") gibt die Zeitzone als IST an

148

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/UTCZeitzone 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.

Pradip Borde
quelle
3
Ja, das ist es, was 'Z' darstellt. Z-Zeitzone
Woody
5
Z = Zulu Zeit => GMT + 0, Sie haben offensichtlich nicht Ihrem Land gedient;)
MushyPeas

Antworten:

250

Sie haben nicht festgelegt, dass die Zeitzone nur Zam 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.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Peter Lawrey
quelle
3
Wenn Sie ein Datum haben, z. B. 2012-12-06T06: 00: 00 ohne das Z, steht das für GMT?
Binarygiant
3
@binarygiant Du müsstest diejenigen fragen, die es gesendet haben. Es könnte die Ortszeit des Absenders sein.
Peter Lawrey
2
Die Zeitzone kann auf "UTC" eingestellt werden
Prashanth
2
Anstatt die Zeitzone an so vielen Stellen für verschiedene Bibliotheken festzulegen und Konflikte mit der Zeitzone Ihres Computers / Laptops zu vermeiden, sollten Sie immer die Standardzeitzone der JVM festlegen, indem Sie die Systemeigenschaft user.timezone festlegen: java -Duser.timezone = GMT ...
Kisna
100

'T'und 'Z'werden hier als Konstanten betrachtet. Sie müssen Zohne 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"

Subir Kumar Sao
quelle
Subir, danke für deine Antwort, aber was ist "0700" an die Eingabezeichenfolge angehängt?
Pradip Borde
-0700ist die Zeitzone dh -7: 00 Uhr
Subir Kumar Sao
12
für -07: 00 Stunde und nicht -0700 wäre es das Folgende: JJJJ-MM-TT'T'HH: mm: ss.SSSXXX
Tastybrownies
48

Vom ISO 8601-String zum Java-Datumsobjekt

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

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 DateObjekten in ISO 8601 Standard ( yyyy-MM-dd'T'HH:mm:ss'Z') den folgenden Code

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));           
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

Beachten Sie auch, dass ohne ' 'bei Z yyyy-MM-dd'T'HH:mm:ssZdruckt2015-01-22T03:41:02+0000

AZ_
quelle
2
Es gibt mir java.text.ParseException: Nicht analysierbares Datum: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....
41

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 Xam 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:

  1. Sie müssen nicht von Ihren Kunden verlangen, dass sie das Datum in GMT senden
  2. Sie müssen Ihr Date-Objekt nicht explizit in GMT konvertieren, indem Sie Folgendes verwenden: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Mein Titel
quelle
1
Ich verwende playdie automatische Formularbindung und verwende @Format.DateTimeAnmerkungen. Standardmuster mit Zam Ende verwenden scheint falsch zu sein. Nach dem Wechsel zu Xfunktioniert es. Vielen Dank
Transang
Wenn Ihr Datum die Zeitzone in einer RFC822-kompatiblen Weise wie "-0500" angibt, funktioniert dies einwandfrei. Bei einem Datum wie "2013-07-15T10: 22: 17-05: 00" (auch gültig nach ISO8601 TZ) ist dies jedoch nicht möglich. In diesem Fall müssen Sie "JJJJ-MM-TT'T'HH: MM: SSXXX" verwenden.
Lambart
23

tl; dr

Die anderen Antworten sind ab Java 8 veraltet.

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

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/ .Calendarund java.text.SimpleDateFormatwurden 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 toStringMethode 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 Instantist ein Moment auf der Timeline in UTC .

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

Sie können nach Bedarf eine Zeitzone anwenden , um ein ZonedDateTimeObjekt zu erstellen .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );

Tabelle der Datums- und Uhrzeittypen in Java, sowohl modern als auch alt

Basil Bourque
quelle
22

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

Dritter
quelle
0

Für Java 8: Sie können Inbuilt verwenden java.time.format.DateTimeFormatter, um die Wahrscheinlichkeit von Tippfehlern wie z

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_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 werden

niraj
quelle