wake-up-neo.com

Wie wird das Datum von GMT-Zeitzone in IST-Zeitzone und umgekehrt in Android analysiert?

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);
11
Amritpal Singh

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 XXX 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

21

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.

3
Jon Skeet

tl; dr

OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" )  // Parsed.
              .toInstant()                               // Adjusted to UTC.

Siehe Live-Code in IdeOne.com .

ISO 8601

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.

Java.time

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 ) );

Zeitzone

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]


Über Java.time

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? 

  • Java SE 8 und SE 9 und später
    • Eingebaut. 
    • Teil der Standard-Java-API mit einer mitgelieferten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 und SE 7
    • Ein Großteil der Java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert.
  • Android

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 .

2
Basil Bourque

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()); 
1
Kalpesh