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


141

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

У Windows визначено центральний часовий пояс, але коли я запускаю наступну програму, це дає мені час GMT.

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: Я компілюю та закликаю DateTest з командного рядка Windows. Але це лише тестовий клас. Первісна проблема полягала в якомусь процесі ETL для сервера IBM cognos.
Кушаль Паудіал

1
просто хотів виключити його запуск через будь-які сценарії оболонки / пакетні, які можуть передавати -Duser.timezoneзначення
matt b

Відповіді:


220

Ви можете передати JVM цей парам

-Duser.timezone

Наприклад

-Duser.timezone=Europe/Sofia

і це повинно зробити трюк. Встановлення змінної середовища TZ також робить фокус в Linux.


Нам довелося скористатися інструментом оновлення часового поясу JDK - 1.3.25 (tzupdater), а потім змінити параметр JVM, як ви запропонували, і ми нарешті позбулися проблеми. До речі, інформація про часовий пояс зберігається Windows в якомусь реєстрі. Оновник, який я використав, також оновив значення реєстру.
Кушаль Паудіал

1
Я намагаюся запустити свій JVM за допомогою цього параметра, але, схоже, немає змін ... Якщо я хочу запустити в UTC, що я повинен використовувати як параметр !?
rafa.ferreira

У своїй програмі я змінюю деякі місця та отримую часові пояси цих місць. Використовуючи часовий пояс, я обробляю далі. Але коли програма починається вперше, я отримую правильні значення. Коли я змінюю TimeZone і встановлюю новий часовий пояс як часовий пояс за замовчуванням, я не отримую правильних значень. Що таке проблема? Як точно змінити часовий пояс. Я змінюю часовий пояс за допомогою TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray

2
Список часових поясів для TZ тут: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Використання назви часового поясу краще, ніж зміщення, оскільки воно буде справляти економію денного світла.
Брайан

65

Ви також можете встановити часовий пояс за замовчуванням у своєму коді, використовуючи наступний код.

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

Вашому

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

1
"Зауважте, що я не хочу встановлювати часовий пояс із програми."
AbVog

22

Прийнята відповідь вище:

-Duser.timezone="Europe/Sofia" 

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

-Duser.timezone=Europe/Sofia

2
Я згоден. Я відредагував оригінальну відповідь, щоб видалити цитати.
Газ

1
Це залежить від використовуваної оболонки.
vadipp

10

У Windows 7 та для JDK6 мені довелося додати -Duser.timezone="Europe/Sofia"до системної змінної JAVA_TOOL_OPTIONS, розташованої у розділі "Мій комп'ютер => Властивості => Додаткові параметри системи => Змінні середовища".

Якщо у вас вже є якийсь інший властивість, JAVA_TOOL_OPTIONSпросто додайте пробіл та вставте рядок властивості.


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());

4

Якщо ви використовуєте Maven :

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

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"для Spring Boot v1.
Хлоя

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.