Перейти к основному содержимому

Как установить часовой пояс JVM

· 3 мин. чтения

1. Обзор

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

В этом руководстве мы рассмотрим несколько способов изменения часового пояса JVM . Мы также узнаем о некоторых ловушках, связанных с управлением часовым поясом.

2. Введение в часовой пояс

По умолчанию JVM считывает информацию о часовом поясе из операционной системы. Эта информация передается классу TimeZone , который хранит часовой пояс и вычисляет летнее время .

Мы можем вызвать метод getDefault, который вернет часовой пояс, в котором работает программа. Кроме того, мы можем получить список поддерживаемых идентификаторов часовых поясов из приложения, используя TimeZone.getAvailableIDs() .

При присвоении имени часовому поясу Java опирается на соглашение об именах базы данных tz .

3. Изменение часового пояса

В этом разделе мы рассмотрим несколько способов изменения часового пояса в JVM.

3.1. Установка переменной среды

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

Например, в среде на базе Linux мы можем использовать команду экспорта :

export TZ="America/Sao_Paulo"

После установки переменной среды мы видим, что часовой пояс нашего работающего приложения теперь Америка/Сан-Паулу:

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("America/Sao_Paulo"));

3.2. Установка аргумента JVM

Альтернативой установке переменной среды является установка аргумента JVM user.timezone . Этот аргумент JVM имеет приоритет над переменной среды TZ .

Например, мы можем использовать флаг -D при запуске нашего приложения:

java -Duser.timezone="Asia/Kolkata" com.company.Main

Точно так же мы также можем установить аргумент JVM из приложения :

System.setProperty("user.timezone", "Asia/Kolkata");

Теперь мы можем видеть, что часовой пояс — Азия/Калькутта:

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Asia/Kolkata"));

3.3. Установка часового пояса из приложения

Наконец, мы также можем изменить часовой пояс JVM из приложения с помощью класса TimeZone . Этот подход имеет приоритет как над переменной среды, так и над аргументом JVM.

Установить часовой пояс по умолчанию очень просто:

TimeZone.setDefault(TimeZone.getTimeZone("Portugal"));

Как и ожидалось, часовой пояс сейчас Португалия :

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Portugal"));

4. Подводные камни

4.1. Использование трехбуквенных идентификаторов часовых поясов

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

Вместо этого мы должны использовать более длинные имена, так как трехбуквенные идентификаторы неоднозначны. Например, IST может быть стандартным временем Индии, стандартным временем Ирландии или стандартным временем Израиля.

4.2. Глобальные настройки

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

Например, нам, вероятно, нужно перевести время в часовой пояс конечного пользователя, поэтому глобальный часовой пояс не имеет особого смысла. Если глобальный часовой пояс не нужен, рассмотрите возможность указания часового пояса непосредственно в каждом экземпляре даты и времени. Для `` этого удобен класс ZonedDateTime или OffsetDateTime .

5. Вывод

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

Как обычно, все примеры, использованные в этой статье, доступны на GitHub.