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

141

Я пытаюсь запустить программу на Java, но по умолчанию используется часовой пояс GMT, а не часовой пояс, определенный ОС. Моя версия JDK - 1.5, а ОС - Windows Server Enterprise (2007).

В Windows указан часовой пояс Central, но когда я запускаю следующую программу, она показывает время по Гринвичу.

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

Вот результат

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

Обратите внимание, что я не хочу устанавливать часовой пояс из приложения. Я хочу, чтобы часовой пояс, используемый JVM, был указан в ОС. (Я не нахожу этой проблемы с другими серверами, на которых установлена ​​версия 1.4 JDK и Microsoft Server 2003).

Любые мысли будут высоко оценены.

Кушал Паудьял
источник
1
Хм, это странно. Похоже на ошибку JVM / OS или странную неправильную конфигурацию.
Майкл Боргвардт,
как вы вызываете DateTestкласс?
matt b
@matt b: я компилирую и вызываю DateTest из командной строки Windows. Но это всего лишь тестовый класс. Первоначальная проблема заключалась в некотором процессе ETL для сервера IBM Cognos.
Кушал Паудьял,
1
просто хотел исключить запуск его через любые сценарии оболочки / пакета, которые могут передавать -Duser.timezoneзначение
Мэтт Б.

Ответы:

225

Вы можете передать JVM этот параметр

-Duser.timezone

Например

-Duser.timezone=Europe/Sofia

и это должно помочь. Установка переменной окружения TZ также помогает в Linux.

Божидар Бацов
источник
Нам пришлось использовать инструмент обновления часового пояса JDK DST - 1.3.25 (tzupdater), а затем изменить параметр JVM, как вы предложили, и мы, наконец, избавились от проблемы. Кстати, информация о часовом поясе хранится Windows в каком-то реестре. Программа обновления, которую я использовал, также обновила значения реестра.
Кушал Паудьял
1
Я пытаюсь запустить свою JVM, используя этот параметр, но, похоже, без изменений ... Если я хочу начать в UTC, что мне использовать в качестве параметра !?
rafa.ferreira
В моем приложении я меняю некоторые местоположения и получаю часовые пояса для этих местоположений. Используя часовой пояс, который я обрабатываю дальше, но когда приложение запускается в первый раз, я получаю правильные значения. Когда я меняю часовой пояс и устанавливаю новый часовой пояс в качестве часового пояса по умолчанию, я получаю неверные значения. В чем проблема? Как точно изменить часовой пояс. Я меняю часовой пояс с помощью TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray
3
Список часовых поясов для TZ находится здесь: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Использование имени часового пояса лучше, чем смещение, потому что оно будет работать с летним днем.
Брайан
66

Вы также можете установить часовой пояс по умолчанию в своем коде, используя следующий код.

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

Вашему

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
Али786
источник
1
«Обратите внимание, что я не хочу устанавливать часовой пояс из приложения».
AbVog
23

Принятый ответ выше:

-Duser.timezone="Europe/Sofia" 

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

-Duser.timezone=Europe/Sofia
WN4yhihiY
источник
2
Согласен. Я отредактировал исходный ответ, чтобы удалить кавычки.
GaZ
2
Это зависит от используемой оболочки.
vadipp
11

На окнах 7 и JDK6, мне пришлось добавить -Duser.timezone="Europe/Sofia"к JAVA_TOOL_OPTIONS системной переменной , расположенной в разделе «Мой компьютер => Свойства => Переменные Дополнительные параметры системы => Окружающая среда».

Если у вас уже есть какое-то другое свойство, JAVA_TOOL_OPTIONSпросто добавьте пробел, а затем вставьте строку свойства.

ВолканТ
источник
5

Если вы используете Maven :

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
МихалСв
источник
mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"для Spring Boot v1.
Хлоя
5

Два варианта, которые, как мне кажется, не были рассмотрены в других ответах:

Избегайте необходимости

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

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

Пример вывода:

2018-10-11T14: 59: 16.742020 + 05: 00 [Азия / Душанбе]

System.setProperty

Для многих целей следующий способ не будет предпочтительным и, безусловно, может быть использован неправильно. Для программ «выбросить» я иногда нахожу это практичным. Вы также можете установить системное свойство из Java:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

Это только что напечатано:

2018-10-11T21: 03: 12.218959 + 11: 00 [Австралия / Тасмания]

Если вам нужна проверка передаваемой строки, используйте:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());
Оле В.В.
источник
0

В win7, если вы хотите установить правильный часовой пояс в качестве параметра в JRE, вам нужно отредактировать файл, deployment.propertiesхранящийся в пути, c:\users\%username%\appdata\locallow\sun\java\deploymentдобавив строку deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone

Дэйв
источник
Я попробовал, и он не работает (jvm выполняется из intellij)
kumetix
0

Установка переменной среды TZтакже должна работать

пример: export TZ=Asia/Shanghai

Голод
источник