Как правильно установить JVM TimeZone - PullRequest
116 голосов
/ 22 марта 2010

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

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

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).

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

Ответы [ 7 ]

184 голосов
/ 22 марта 2010

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

-Duser.timezone

Например

-Duser.timezone=Europe/Sofia

, и это должно сработать.Установка переменной среды TZ также помогает в Linux.

50 голосов
/ 12 мая 2016

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

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

Твоему

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
21 голосов
/ 04 декабря 2013

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

-Duser.timezone="Europe/Sofia" 

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

-Duser.timezone=Europe/Sofia
10 голосов
/ 17 июня 2014

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

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

3 голосов
/ 19 августа 2014

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

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
2 голосов
/ 11 октября 2018

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

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

Что бы вы ни делали для установки часового пояса 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 голосов
/ 18 декабря 2013

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

...