Как правильно установить JVM TimeZone

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

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

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

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

7 ответов

Решение

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

-Duser.timezone

Например

-Duser.timezone=Europe/Sofia

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

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

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

К твоему

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));

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

-Duser.timezone="Europe/Sofia" 

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

-Duser.timezone=Europe/Sofia

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

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

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

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

Что бы вы ни делали для установки часового пояса 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());

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

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."

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

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

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

Другие вопросы по тегам