Часовой пояс Java испорчен - PullRequest
29 голосов
/ 09 августа 2008

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

Ответы [ 4 ]

24 голосов
/ 12 октября 2010

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

24 голосов
/ 09 августа 2008

Это «причуда» в том, как 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" в команды.

1 голос
/ 08 октября 2008

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

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

0 голосов
/ 09 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...