Узнайте, как установить часовой пояс по умолчанию, используемый JVM, с помощью переменной среды, аргумента JVM и класса TimeZone.
1. Обзор
Пользователи любого приложения хотят видеть даты и временные метки в своем местном часовом поясе, и никто не любит вносить корректировки в часовой пояс в уме.
Чтобы показывать пользователям локальные метки времени, часовой пояс, используемый JVM, должен быть предсказуемым и желательно фиксированным. Это делает модульное тестирование и интеграционное тестирование приложения, касающееся меток времени, специфичных для часового пояса, простыми и более надежными.
Настройка часового пояса JVM более необходима в моделях распределенного развертывания, где приложение работает в нескольких центрах обработки данных по всему миру, а JVM в каждом центре обработки данных могут иметь разный часовой пояс.
- По умолчанию JVM считывает информацию о часовом поясе из операционной системы и сохраняет ее в классе TimeZone.
- Чтобы получить часовой пояс по умолчанию, установленный в JVM, используйте метод TimeZone.getDefault().
- Чтобы получить список всех поддерживаемых часовых поясов, используйте метод TimeZone.getAvailableIDs().
- Java использует соглашение об именовании базы данных tz.
2. Как установить часовой пояс для JVM
2.1. Установите переменную среды «TZ»
Установите переменную среды TZ, которую JVM может использовать для получения часового пояса по умолчанию в JVM.
В Linux мы можем использовать команду export.
export TZ="Asia/Kolkata"
В Windows мы можем установить часовой пояс, как описано выше, с помощью Панели управления -> Дата и время -> Изменить часовой пояс -> Выберите предпочитаемый вами часовой пояс.

После установки переменной среды мы можем проверить ее в нашей программе Java.
TimeZone timezone = TimeZone.getDefault();System.out.printf("DisplayName = %s, ID = %s, offset = %s",timeZone.getDisplayName(),timeZone.getID(),timeZone.getRawOffset());
Вывод программы.
DisplayName = Coordinated Universal Time, ID = UTC, offset = 0
2.2. Установите аргумент JVM или системное свойство «user.timezone»
Если настройка переменной окружения невозможна, то мы можем установить часовой пояс с помощью аргумента JVM -Duser. timezone. Не заключайте значение часового пояса в двойные кавычки.
java -Duser.timezone=UTC com.app.Main//orjava -Duser.timezone=Asia/Kolkata com.app.Main
Этот же аргумент мы можем задать с помощью системного свойства «user.timezone».
System.setProperty("user.timezone", "UTC");
Теперь мы можем проверить обновленное значение часового пояса в программах Java.
TimeZone timezone = TimeZone.getDefault();System.out.printf("DisplayName = %s, ID = %s, offset = %s",timeZone.getDisplayName(),timeZone.getID(),timeZone.getRawOffset());
Вывод программы.
DisplayName = Coordinated Universal Time, ID = UTC, offset = 0
2.3.TimeZone.setDefault()
Другой способ, аналогичный настройке системного свойства, — это установка часового пояса по умолчанию непосредственно в классе TimeZone.
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Проверка значения часового пояса даст тот же результат, что и в предыдущих методах.
3. Как JVM определяет часовой пояс
По умолчанию классы Java Date и Time выбирают информацию о часовом поясе из операционной системы. Способ, которым JVM определяет часовой пояс ОС, отличается в каждой операционной системе.
Один из способов получить часовой пояс машины — из системных часов и изменить желаемый часовой пояс в часах. Но этот подход невозможен в облачной среде, где ресурсы предоставляются по требованию.
Мы можем изменить значение часового пояса с помощью аргументов JVM во время выполнения и операторов Java в приложении.
Обратите внимание, что:
- Переменная среды TZ, если она доступна, переопределяет часовой пояс системы по умолчанию.
- Аргумент JVM -Duser.timezone переопределяет переменную среды TZ.
- TimeZone.setDefault() переопределяет аргумент -Duser.timezone.
4. Лучшие практики
- Никогда не полагайтесь на часовой пояс машины по умолчанию. Всегда указывайте желаемый/ожидаемый часовой пояс, используя один из вышеупомянутых методов.
- Приложение может иметь временные метки, чувствительные к часовому поясу, когда после развертывания приложения в облачной среде оно может быть перемещено в другие центры обработки данных без нашего ведома. Чтобы избежать этих несоответствий, рекомендуется устанавливать часовой пояс JVM с помощью системного свойства -Duser.timezone.
- Если наше требование заключается в использовании часового пояса не только JVM, но и всеми ее дочерними процессами, такими как IDE, то установка переменной окружения TZ имеет больше смысла. Хорошим примером этого является установка этой переменной при запуске Eclipse, и тогда она будет во всех JVM, запущенных Eclipse.
- Мы должны предпочесть использовать более длинные названия часовых поясов вместо трехбуквенных идентификаторов. Существуют короткие идентификаторы, которые дублируются среди нескольких часовых поясов. Например, IST может быть либо стандартным временем Индии, либо стандартным временем Ирландии, либо стандартным временем Израиля.
5. Заключение
В этом уроке мы научились устанавливать часовой пояс по умолчанию, используемый JVM в операционных системах Unix и Windows.
Рекомендуется всегда устанавливать часовой пояс по умолчанию либо на уровне JRE, либо на уровне приложения, чтобы получать согласованные и ожидаемые временные метки.