Любая разница между java.time.Clock.systemDefaultZone (). GetZone () vs java.util.TimeZone.getDefault (). ToZoneId ()?

Есть ли разница между ними, учитывая, что и java.time.Clock.systemDefaultZone().getZone() и java.util.TimeZone.getDefault().toZoneId() возвращает тот же результат.

Например, этот код

 import java.time.Clock; import java.util.TimeZone; public class Main { public static void main(String[] args) { System.out.println("Clock.systemDefaultZone().getZone() : " + Clock.systemDefaultZone().getZone()); System.out.println("TimeZone.getDefault().toZoneId() : " + TimeZone.getDefault().toZoneId()); } } 

возвращает этот результат

 Clock.systemDefaultZone().getZone() : Europe/Paris TimeZone.getDefault().toZoneId() : Europe/Paris 

Оба возвращают часовой пояс JVM по умолчанию (в конце, Clock вызывает TimeZone.getDefault() , как объясняется в ответе @ Kiskae ), но не гарантируется, что все вызовы всегда будут возвращать одинаковое значение каждый раз .

Это связано с тем, что часовой пояс по умолчанию можно изменить:

  • система, в которой работает JVM, может изменить свою конфигурацию. Например, в машинах Windows эта информация считывается из реестра , а в Linux – из /etc/localtime (обычно это ссылка на определенный файл в /usr/share/zoneinfo ) или в другой подобной папке (она может изменяться в каждая версия / распределение), или путем установки переменной окружения TZ . Если эта системная конфигурация меняет его, и JVM перезапускается, внезапно ваш код начинает возвращать разные значения
  • JVM может быть настроен на использование другого часового пояса , независимо от конфигурации ОС. Одним из примеров является то, что команда maintanance / infrastructure изменяет эту конфигурацию (с целью или случайно, и обычно не сообщая разработчикам …), а затем ваш код больше не возвращает те же значения (и все, что зависит от часового пояса, будет внезапно сломать)
  • ваше приложение (или другое приложение с тем же JVM) вызывает метод TimeZone.setDefault() . Это повлияет на все приложения, работающие в одном JVM, во время выполнения , поэтому, если вы запустите этот код:

     TimeZone.setDefault(TimeZone.getTimeZone("Europe/London")); System.out.println(ZoneId.systemDefault()); TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); System.out.println(ZoneId.systemDefault()); TimeZone.setDefault(TimeZone.getTimeZone("UTC")); System.out.println(ZoneId.systemDefault()); 

Выход будет:

Европа / Лондон
Америка / Триатлон
универсальное глобальное время

Обратите внимание, как легко изменить часовой пояс по умолчанию во время выполнения, и все последующие вызовы для его получения затронуты. То же самое произойдет, если вы вызове Clock.systemDefaultZone().getZone() или TimeZone.getDefault().toZoneId() , потому что оба используют часовой пояс по умолчанию.

Поскольку это изменяет часовой пояс JVM по умолчанию, все приложения, работающие в одной JVM, будут затронуты этим. Это может привести к неожиданным ошибкам, которые трудно отлаживать.

Хотя методы, которые используют часовой пояс по умолчанию, удобны, вы должны проверить, как ваш код зависит от него и как он может быть затронут, если зона изменяется.

Если вы не хотите полагаться на значение по умолчанию, идеальным является использование определенного часового пояса, такого как ZoneId.of("Europe/Paris") . Всегда предпочитайте имена часовых поясов IANA (всегда в формате Region/City , например America/New_York или Europe/Paris ). Избегайте использования коротких сокращений (например, CET или CEST ), потому что они неоднозначны и не являются стандартными .

Вы можете получить список доступных часовых поясов (и выбрать тот, который наилучшим образом соответствует вашей системе), вызывая ZoneId.getAvailableZoneIds() .

Посмотрев исходный код на grepcode, они в конечном итоге выполняют одни и те же методы, что приводит к такому же результату. Clock.systemDefaultZone() вызывает ZoneId.systemDefault() , который возвращает TimeZone.getDefault().toZoneId() :

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/time/ZoneId.java#ZoneId.systemDefault%28%29

  • Как я могу анализировать даты и преобразовывать часовые пояса в Perl?
  • Поиск временной зоны по широте долготы
  • Java SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ss'Z '") дает часовой пояс как IST
  • Разбор даты и времени ISO8601 (включая TimeZone) в Excel
  • В каком часовом поясе отображается Date.toString ()?
  • Как бороться с проблемой часового пояса при хранении дат в utc с использованием mongod?
  • Почему вычитание этих двух раз (в 1927 году) дает странный результат?
  • Преобразование даты времени UTC в локальное время
  • Как получить текущую дату и время в UTC или GMT на Java?
  • Давайте будем гением компьютера.