tl; dr
ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" )) // Current moment in a particular time zone.
.withZoneSameInstant( ZoneId.of( "Asia/Kolkata" )) // Same moment adjusted into another time zone.
Подробности
Классу java.util.Date не присвоен часовой пояс † , но его реализация toString
сбивает с толкутекущий часовой пояс JVM по умолчанию.
Избегайте java.util.Date & .Calendar
Это одна из многих причин избегать печально известных классов java.util.Date, .Calendar и SimpleDateFormat, связанных с Java.Избежать их.Вместо этого используйте:
java.time
Java 8 и более поздних версий имеет встроенный пакет java.time .Этот пакет был вдохновлен Joda-Time .Хотя они имеют некоторые общие черты и имена классов, они разные;у каждого есть особенности, у другого нет.Одно заметное отличие состоит в том, что java.time избегает конструкторов, а вместо этого использует статические методы создания экземпляров.Обе структуры возглавляет один и тот же человек, Стивен Колборн .
Большая часть функциональности java.time была перенесена в Java 6 & 7 в проекте ThreeTen-Backport .Далее адаптирован для Android в проекте ThreeTenABP .
В случае с этим Вопросом они работают одинаково.Укажите часовой пояс и вызовите метод now
, чтобы получить текущий момент, затем создайте новый экземпляр на основе старого неизменяемого экземпляра, чтобы настроить его для часового пояса.
Обратите внимание на два разныхклассы часовых поясов.Одним из них является именованный часовой пояс, включающий все правила перехода на летнее время и другие подобные аномалии, а также смещение от UTC, в то время как другое является только смещением.
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 );
Joda-Time
НекоторыеПример кода в Joda-Time 2.3 следует.Найдите в StackOveflow еще много примеров и много обсуждений.
DateTimeZone timeZoneLondon = DateTimeZone.forID( "Europe/London" );
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime nowLondon = DateTime.now( timeZoneLondon ); // Assign a time zone rather than rely on implicit default time zone.
DateTime nowKolkata = nowLondon.withZone( timeZoneKolkata );
DateTime nowNewYork = nowLondon.withZone( timeZoneNewYork );
DateTime nowUtc = nowLondon.withZone( DateTimeZone.UTC ); // Built-in constant for UTC.
У нас есть четыре представления одного и того же момента на временной шкале Вселенной.
† На самом деле java.util.Date
класс имеет часовой пояс, скрытый в его исходном коде .Но класс игнорирует этот часовой пояс для большинства практических целей.Таким образом, в качестве стенограммы часто говорят, что juDate не имеет назначенного часового пояса.Смешение?Да.Избегайте беспорядка, который является juDate и используйте Joda-Time и / или java.time.