2016-07-21 21 views
0

Ich habe diese SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .So, wenn ich passiere Datum 2016-01-01T10:30:00-0800 mehr als oder gleich 10: 30: 00-0800 Zeit dann wird parsen (Datum) Antwort, die am nächsten Tag ist Datum 2016-01-02T00: 00: 00 + 0530 was wird nicht erwartet.Es ändert Datum um einen Tag.Wenn ich gebe 2016-01-01T10: 20: 00-0800 geben Sie dann genaues Datum.So sollte die Zeit weniger sein t10: 30: 00-0800 dann erwarteter Ergebnis sonst nächste Tag Datum.SimpleDateFormat ("JJJJ-MM-TT'T'HH: MM: SSZ") parsen in Java gibt falsches Datum?

Voll Code:

SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
public Date deserialize(JsonParser jsonparser, DeserializationContext arg1) { 
    String date = jsonparser.getText(); 
    dt.parse(date); 
} 
+0

Was ist Ihr Standort? – Abhay

+0

@abhay App Server läuft auf UTC-Zeit und lokale Maschine Indien – techsavvy

+0

Zeigen Sie Ihren Code, der das genaue Problem zeigt. – Jesper

Antwort

3

Es ist wichtig, dass eine Instanz der Klasse zu verstehen java.util.Date ist kein Kalenderdatum, sondern ein Moment in der Zeit.

Das Konvertieren einer java.util.Date in und aus einer Zeichenfolgendarstellung bezieht immer Zeitzonen ein.

Ihre Eingabe lautet 2016-01-01T10:30:00-0800, was einen Zonenoffset von -8 Stunden angibt (die Zeitzone von Los Angeles, USA). Dieser Zeitpunkt entspricht 2016-01-01T18:30:00+0000 in einer Zone mit einem Offset von 0 Stunden (wie London, GB) oder 2016-01-02T00:00:00+0530 innerhalb Ihrer lokalen Zeitzone.

Das ist in Ordnung, wenn Sie den Moment speichern möchten, in dem ein Meeting in Los Angeles beginnt und diesen Moment in verschiedenen Zeitzonen anzeigt.

Wenn Sie Daten (wie Geburtstage) darstellen möchten, die keine inhärenten Zeitinformationen enthalten, sollten Sie besser java.time.LocalDate (wenn Sie Java 8 verwenden) oder.(wenn Java 8 keine Option ist) verwenden.

+0

Wenn Benutzer aus verschiedenen Zonen kommen, wenn das Anfragedatum seiner lokalen Zeitzone entspricht, dann muss das Datum für das Projekt entsprechend seiner lokalen Zone oder gemäß der UTC-Zeit eingestellt werden, da das gleiche Datum für USA-Benutzer 1 Jan haben kann wird am nächsten Tag für indische user.users aus der ganzen Welt sein, die dieses Datum sehen. – techsavvy

0

java.time

Sie verwenden alte veraltete Datum-Zeit-Klassen, die schlecht konzipiert, verwirrend und mühsam erwiesen werden. Verwenden Sie stattdessen java.time.

Das java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die alten problematischen Datum-Zeit-Klassen wie java.util.Date, .Calendar, & java.text.SimpleDateFormat. Das Team Joda-Time empfiehlt auch die Migration zu java.time.

Weitere Informationen finden Sie unter Oracle Tutorial. Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen.

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport und weiter in ThreeTenABP auf Android angepasst.

ISO 8601

Ihr Eingabestring entspricht ISO 8601 Standard. Diese Standardformate werden standardmäßig in java.time-Klassen verwendet. Sie müssen also kein Formatierungsmuster angeben.

Offset

Ihr Eingangswert hinter UTC ein Offset-von-UTC, eine Reihe von 8 Stunden.

Die Klasse OffsetDateTime repräsentiert solche Werte.

OffsetDateTime odt = OffsetDateTime.parse("2016-01-01T10:30:00-0800"); 

Zeitzone

Eine Zeitzone ist eine Offset-von-UTC und eine Reihe von Regeln für den Umgang mit Anomalien wie Sommerzeit (DST). Wenn Sie sich sicher sind, dass die Zeitzone als Kontext für diesen Wert dient, wenden Sie sie an, um eine ZonedDateTime zu erhalten.

Geben Sie eine Zeitzone (ZoneId) durch eine proper time zone name im Format continent/region an. Verwenden Sie niemals die 3-4 Buchstaben Abkürzungen wie EST oder IST, da diese nicht echte Zeitzonen sind, sind nicht standardisiert und sind nicht einmal einzigartig (!).

ZoneId zoneId = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime zdt = odt.atZone(zoneId); 

Zeitzone ändern

Wenn Sie diesen Wert durch die Linse der lokalen time in India sehen wollen, können Sie eine andere Zeitzone anwenden können einen neuen ZonedDateTime zu erstellen. Die Klassen java.time verwenden das Muster immutable objects. Beachten Sie also, dass die Klassen java.time, anstatt die Zeitzoneneinstellung für ein vorhandenes Objekt zu ändern ("mutate"), ein neues Objekt mit einigen seiner Mitglieder basierend auf den Elementen des ursprünglichen Objekts erstellen.

ZonedDateTime zdt_Kolkata = zdt.withZoneSameInstant(ZoneId.of("Asia/Kolkata")) ; 
+0

Ich kann nicht Java Version 7 zu 8 so für Java 7 jede Alternative haben Sie ändern? – techsavvy

+0

@techsavvy Wiederholen 4. Absatz. –