Ich arbeite an einem Projekt, das Datum/Uhrzeit vom Backend in IST
(indische Standardzeit) abruft, wie gezeigt "2013-01-09T19:32:49.103+05:30"
. Wenn ich es jedoch mit folgendem DateFormat parse
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
gefolgt von parsen ..
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
System.out.println("XYZ ==============>"+date);
sein Anzeigedatum im GMT-Format als Ausgabe, d. h
Wed Jan 09 14:02:49 GMT+00:00 2013.
Ich habe es mit TimeZone als Klasse versucht ..
TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);
aber keine Wirkung ..
Wie könnte ich ein Date
-Klassenobjekt erhalten, das das Datum im IST
-Format anstelle von GMT hat ...
Bitte geben Sie eine geeignete Lösung an.
BEARBEITEN:
So sieht Code aus:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
String formattedDate=sdf.format(date);
System.out.println("XYZ ==============>"+formattedDate);
Datum hat keine Zeitzone. Es ist nur ein Inhaber der Anzahl von Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT. Verwenden Sie dasselbe DateFormat, das Sie zum Analysieren verwendet haben, stellen Sie die IST-Zeitzone ein und formatieren Sie Ihr Datum wie im folgenden Beispiel
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
sdf.setTimeZone(TimeZone.getTimeZone("IST"));
System.out.println(sdf.format(date));
ausgabe
2013-01-09T19:32:49.103+05:30
Beachten Sie, dass XX
X für die Zeitzone ISO-8601 (-08: 00) seit 1.7 verwendet wird. Wenn Sie in 1.6 sind, versuchen Sie Z
. Weitere Informationen zu Formatmustern finden Sie unter SimpleDateFormat-API
Wie könnte ich ein Date-Class-Objekt erhalten, das ein Datum im IST-Format anstelle von GMT hat ...
Du kannst nicht Date
hat kein Format oder eine Zeitzone. Es repräsentiert einfach eine Anzahl von Millisekunden seit der Unix-Epoche um Mitternacht am 1. Januar 1970 UTC. Stattdessen verwendet Date.toString()
immer die Standardzeitzone.
Um ein bestimmtes Format und eine bestimmte Zeitzone zu verwenden, verwenden Sie DateFormat
anstelle von Date.toString()
. Sie können die Zeitzone mit DateFormat.setTimeZone()
einstellen und dann Date
mit DateFormat.format()
in String
konvertieren. DateFormat
selbst verfügt über einige Factory-Methoden zum Erstellen, oder Sie können SimpleDateFormat
verwenden, wenn Sie ein bestimmtes Muster angeben möchten.
Wie Abu sagt, ist Joda Timeist eine viel bessere Datums-/Uhrzeit-API als die integrierte API, obwohl die Standardbibliothek für die Datums-/Uhrzeitformatierung keine schlechte Arbeit leistet. Beachten Sie, dass DateFormat
und ihre Unterklassen im Allgemeinen nicht threadsicher sind.
OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed.
.toInstant() // Adjusted to UTC.
Siehe Live-Code in IdeOne.com .
Ihre Eingabezeichenfolge von 2013-01-09T19:32:49.103+05:30
liegt zufällig im Standardformat ISO 8601 vor. Der +05:30
am Ende zeigt einen Offset-von-UTC von fünfeinhalb Stunden voraus, der in Indien verwendet wird.
Sie verwenden störende alte Datums-/Uhrzeit-Klassen, die jetzt durch die Java.time-Klassen ersetzt werden.
Die Java.time-Klassen verwenden standardmäßig ISO 8601-Formate beim Analysieren/Generieren von Zeichenfolgen, die Datum-Uhrzeit-Werte darstellen. Sie müssen also kein Formatierungsmuster angeben.
Da Ihre Eingabe einen Moment auf der Timeline mit einem Offset von UTC darstellt, analysieren wir als OffsetDateTime
-Objekt.
OffsetDateTime odt = OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" );
odt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30
Um ein einfaches Objekt in UTC value zu erhalten, extrahieren Sie eine Instant
. Diese Instant
-Klasse ist eine grundlegende Bausteinklasse von Java.time. Die Instant
- Klasse repräsentiert einen Moment auf der Zeitleiste in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs).
Sie können sich OffsetDateTime
als Instant
plus eine ZoneOffset
vorstellen.
Instant instant = odt.toInstant(); // UTC.
Beim Aufruf von toString
wird ein String
-Objekt im Standardformat ISO 8601 generiert. Die Z
am Ende ist die Abkürzung für Zulu
und bedeutet UTC.
instant.toString (): 2013-01-09T14: 02: 49.103Z
Eine Instant
ist auf verschiedene Weise eingeschränkt, beispielsweise beim Generieren von Strings in verschiedenen Formaten. Sie können also mit einer OffsetDateTime
arbeiten, die in UTC als Offset eingestellt ist. mit anderen Worten ein Offset von Null. Die ZoneOffset
-Klasse enthält eine Konstante für UTC, ZoneOffset.UTC
.
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
Sie können auch einen Versatz (oder eine Zeitzone) auf eine Instant
anwenden. Rufen Sie atOffset
oder atZone
auf.
Die Instant
-Klasse ist die grundlegende Bausteinklasse von Java.time. Wahrscheinlich häufig in Ihrem Code verwendet, da es die beste Vorgehensweise ist, die meiste Arbeit in UTC zu erledigen.
OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
Beachten Sie, dass ein Offset-von-UTC nicht eine Zeitzone ist. Eine Zeitzone ist ein Versatz plus eine Reihe von Regeln, Vergangenheit und Gegenwart, um Anomalien wie Daylight Saving Time (DST) zu behandeln. Daher ist eine Zeitzone immer nur einem Offset vorzuziehen, wenn Sie sich der richtigen Zone sicher sind.
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
an, beispielsweise America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST
oder IST
, da es sich um nicht true Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig sind (!).
Wenn Sie die vorgesehene Zeitzone kennen, wenden Sie eine ZoneId
an, um ein ZonedDateTime
-Objekt abzurufen. Gehen Sie jedoch niemals davon aus, ohne die Quelle Ihrer Eingabedaten zu überprüfen. Viele verschiedene Zonen können sich einen bestimmten Versatz teilen. Zum Beispiel wird bei unserer Eingabe hier der Versatz +05:30
heute sowohl in Indien (Asia/Kolkata
) als auch in Sri Lanka (Asia/Colombo
) verwendet. Diese beiden Zeitzonen können unterschiedliche Regeln für unterschiedliche Anomalien in ihrer Vergangenheit, Gegenwart oder Zukunft haben.
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
Die toString
-Methode von ZonedDateTime
erweitert das Standardformat nach ISO 8601 auf sinnvolle Weise, indem der Name der Zeitzone in eckigen Klammern angehängt wird. In diesem Fall [Asia/Kolkata]
.
zdt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30 [Asien/Kolkata]
Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Date-Time-Klassen wie Java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time -Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.
Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .
Wo erhalten Sie die Java.time-Klassen?
Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen, wie zum Beispiel Interval
, YearWeek
, YearQuarter
und more .
Sie können dies einfach mit der Calendar-Klasse tun. Bitte überprüfen Sie die folgenden Ausschnitte:
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(<--time stamp-->);
//calendar.setTime(<--date object of gmt date-->);
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy 'at' hh:mm a");
sdf.setTimeZone(TimeZone.getDefault());
String result=sdf.format(calendar.getTime());