Часовой пояс Java испорчен

Я запускаю приложение Tomcat, и мне нужно отобразить некоторые значения времени. К сожалению, время приближается к выходному. Я изучил его и обнаружил, что мой часовой пояс по умолчанию установлен на:

sun.util.calendar.ZoneInfo[id="GMT-08:00",
                           offset=-28800000,
                           dstSavings=0,
                           useDaylight=false,
                           transitions=0,
                           lastRule=null]

Вместо тихоокеанского часового пояса. Это дополнительно указывается, когда я пытаюсь напечатать отображаемое имя часового пояса по умолчанию , и появляется «GMT-08: 00», что, кажется, указывает мне, что он неправильно установлен на часовой пояс Тихоокеанского региона США. Я работаю на Ubuntu Hardy Heron, обновленном с Gutsy Gibbon.

Есть ли файл конфигурации, который я могу обновить, чтобы указать JRE использовать Pacific со всей связанной информацией о переходе на летнее время? Время на моем компьютере отображается правильно, поэтому это не похоже на неправильную конфигурацию всей ОС.


Хорошо, вот обновление. Сотрудник предложил мне обновить JAVA_OPTS в моем / etc / profile, включив в него «-Duser.timezone = US / Pacific», который работал (я также видел CATALINA_OPTS, который я тоже обновил). Фактически, я просто экспортировал изменения в переменные, а не использовал новый / etc / profile (перезагрузка позже внесет изменения, и я буду золотым).

Однако я все еще думаю, что есть лучшее решение ... где-то должна быть конфигурация для Java, в которой указано, какой часовой пояс он использует или как он захватывает часовой пояс. Если кто-то знает такую ​​настройку, это было бы здорово, но пока это достойный обходной путь.


Я использую 1.5, и это определенно проблема летнего времени. Как видите, часовой пояс настроен так, чтобы не использовать летнее время. Я считаю, что он обычно установлен на смещение -8, а не на конкретный часовой пояс Тихого океана. Поскольку в общем смещении -8 нет информации о переходе на летнее время, он, конечно, не использует его, но вопрос в том, где я могу указать Java использовать часовой пояс Тихого океана при запуске? Я НЕ ищу программное решение, это должно быть решение для конфигурации.

Ответов (5)

Решение

Это "причуда" в том, как JVM ищет файл zoneinfo. См. Идентификатор ошибки 6456628 .

Самый простой обходной путь - сделать / etc / localtime символической ссылкой на правильный файл zoneinfo. Для тихоокеанского времени должны работать следующие команды:

# sudo cp /etc/localtime /etc/localtime.dist
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime

У меня не было проблем с подходом символических ссылок.

Изменить: в команды добавлено «sudo».

В Ubuntu недостаточно просто изменить файл / etc / localtime. Кажется, он тоже читает файл / etc / timezone. Лучше следовать инструкции, чтобы правильно установить часовой пояс. В частности, сделайте следующее:

$ sudo cp /etc/timezone /etc/timezone.dist
$ echo "Australia/Adelaide" | sudo tee /etc/timezone
Australia/Adelaide
$ sudo dpkg-reconfigure --frontend noninteractive tzdata

Current default time zone: 'Australia/Adelaide'
Local time is now:      Sat May  8 21:19:24 CST 2010.
Universal Time is now:  Sat May  8 11:49:24 UTC 2010.

В моем Ubuntu, если / etc / localtime и / etc / timezone несовместимы, Java, похоже, считывает часовой пояс по умолчанию из / etc / timezone.

Добавив короткий ответ, который сработал для меня, вы можете использовать его timedatectl для установки часового пояса. Затем перезапустите JVM.

sudo timedatectl set-timezone UTC

Это может помочь дважды проверить правила часовых поясов, которые использует ваша ОС.

/usr/bin/zdump -v /etc/localtime | less

Этот файл должен содержать ваши правила перехода на летнее время, например, этот для 2080 года:

/etc/localtime  Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600

Вы можете сравнить это с правилами часового пояса, которые, по вашему мнению, вам следует использовать. Их можно найти в / usr / share / zoneinfo / .

У меня была похожая проблема, возможно, такая же. Однако мой сервер tomcat работает в окне Windows, поэтому решение для символической ссылки не будет работать.

Я поставил -Duser.timezone=Australia/Sydney в JAVA_OPTS однако кот не признает , что DST был в действительности. В качестве обходного пути я изменил Australia/Sydney (GMT + 10: 00) на Pacific/Numea (GMT + 11: 00), чтобы время отображалось правильно, однако мне хотелось бы узнать фактическое решение или ошибку, если таковая имеется.