Die akzeptierte Antwort richtig ist. Die Klasse java.util.Date hat keine zugewiesene Zeitzone †, aber die Implementierung toString
wendet die aktuelle Standardzeitzone der JVM verwirrend an.
Vermeiden java.util.Date & .Calendar
Dies ist einer von vielen Gründen, die notorisch mühsam java.util.Date, .Calendar und Simple Klassen mit Java gebündelt zu vermeiden. Vermeide sie. Stattdessen verwenden entweder:
Joda-Time
Einige Beispiel-Code in Joda-Time 2.3 folgt. Durchsuchen Sie StackOveflow nach vielen weiteren Beispielen und vielen Diskussionen.
DateTimeZone timeZoneLondon = DateTimeZone.forID("Europe/London");
DateTimeZone timeZoneAthens = DateTimeZone.forID("Europe/Athens");
DateTime nowLondon = DateTime.now(timeZoneLondon);
DateTime nowAthens = nowLondon.withZone(timeZoneAthens);
DateTime nowUtc = nowLondon.withZone(DateTimeZone.UTC);
java.time
Java 8 und hat später eine neue java.time package eingebaut. Dieses Paket wurde von Joda-Time inspiriert. Während sie einige Ähnlichkeiten und Klassennamen teilen, sind sie unterschiedlich; jeder hat Merkmale, die anderen fehlen. Ein bemerkenswerter Unterschied besteht darin, dass java.time Konstruktoren vermeidet und stattdessen statische Instanziierungsmethoden verwendet.
Im Falle dieser Frage funktionieren sie in der gleichen Weise. Geben Sie eine Zeitzone an und rufen Sie eine Methode now
auf, um den aktuellen Zeitpunkt abzurufen, und erstellen Sie dann eine neue Instanz basierend auf der alten unveränderlichen Instanz, um die Zeitzone anzupassen.
Beachten Sie die zwei verschiedenen Zeitzonen-Klassen. Eine ist eine benannte Zeitzone, die alle Regeln für die Sommerzeit und andere solche Anomalien plus einen Offset von UTC enthält, während die andere nur der Offset ist.
ZoneId zoneMontréal = ZoneId.of("America/Montreal");
ZonedDateTime nowMontréal = ZonedDateTime.now (zoneMontréal);
ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant(zoneTokyo);
ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant(ZoneOffset.UTC);
† Tatsächlich ist die java.util.Date
Klasse tut eine Zonenzeit innerhalb its source code begraben. Aber die Klasse ignoriert diese Zeitzone für die meisten praktischen Zwecke. Kurz gesagt, es wird oft gesagt, dass j.u.Date keine Zeitzone zugewiesen hat. Verwirrend? Ja. Vermeiden Sie das Durcheinander, das j.u.Date ist und gehen Sie mit Joda-Time und/oder java.time.
Möchten Sie [Joda Zeit] (http://stackoverflow.com/a/375803/1037210) verwenden? Es ist meine Vorliebe. – Lion
Überprüfen Sie [diese Antwort] (http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java). Es könnte nützlich sein. – Gamb
Ich fand eine andere Sache im Internet, die wahrscheinlich die sauberste Lösung ist, ein Datumsformat zu verwenden, um die Datumszeichenfolge zu analysieren und das Datum in der entsprechenden Zeitzone zurückzugeben. – Bober02