Как правильно установить 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