Подтвердить что ты не робот

Часовой пояс Java запутан

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

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 использовать "Тихоокеанский регион" со всеми данными о летнем времени? Время на моей машине отображается правильно, поэтому это не похоже на неправильную конфигурацию в OS.


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

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


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

4b9b3361

Ответ 1

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

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

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

У меня не было никаких проблем с использованием подхода symlink.

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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