Zaakceptowanych odpowiedź jest poprawna. Klasa java.util.Date nie ma przypisanej strefy czasowej †, ale jest to implementacja toString
w sposób mylący stosuje bieżącą domyślną strefę czasową maszyny JVM.
Unikaj java.util.Date & .Calendar
Jest to jeden z wielu powodów, aby uniknąć kłopotliwego java.util.Date się notorycznie, .Calendar i zajęcia SimpleDateFormat wiązane z Java. Unikaj ich. Zamiast używać albo:
Joda-Time
Niektóre przykładowy kod w Joda-Time 2.3 poniżej. Szukaj StackOveflow na wiele innych przykładów i dyskusji.
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, a później ma nową java.time package wbudowane. Ten pakiet został zainspirowany przez Joda-Time. Chociaż mają pewne podobieństwa i nazwy klas, są różne; każdy ma cechy innych braków. Jedną z istotnych różnic jest to, że java.time unika konstruktorów, zamiast tego używa statycznych metod tworzenia instancji.
W przypadku tego pytania działają one w taki sam sposób. Określ strefę czasową i wywołaj metodę now
, aby uzyskać bieżący moment, a następnie utwórz nową instancję na podstawie starej niezmiennej instancji, aby dostosować do strefy czasowej.
Zwróć uwagę na dwie różne klasy stref czasowych. Jednym z nich jest nazwana strefa czasowa zawierająca wszystkie reguły dotyczące czasu letniego i inne takie anomalie plus przesunięcie względem UTC, podczas gdy druga jest tylko przesunięciem.
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);
† Właściwie klasa java.util.Date
robi posiada strefę czasową pochowany wewnątrz its source code. Ale klasa ignoruje tę strefę czasową w większości praktycznych celów. Tak więc, jako skrót, często mówi się, że j.u.Date nie ma przypisanej strefy czasowej. Mylące? Tak. Unikaj bałaganu j.u.Date i korzystaj z Joda-Time i/lub java.time.
Czy chcesz użyć [Joda time] (http://stackoverflow.com/a/375803/1037210)? To moje preferencje. – Lion
Sprawdź [tę odpowiedź] (http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java). Może się przydać. – Gamb
Znalazłem inną rzecz w Internecie, która jest prawdopodobnie najczystszym rozwiązaniem, do użycia formatu daty w celu przeanalizowania ciągu daty i zwrócenia daty w odpowiedniej strefie czasowej – Bober02