2008-08-08 5 views
26

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

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


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

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


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

ответ

20

Это «причуда» в том, как JVM просматривает файл zoneinfo. См. Bug ID 6456628.

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

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

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

Редактировать: Добавлены команды «sudo».

+0

+1: Я просто столкнулся с этим на полностью обновленном сервере Ubuntu 9.10. Sun JDK 1.6.0_15-b03, система настроена во время установки для часовой пояс США/Восточной зоны./etc/localtime содержит идентичное содержимое/usr/share/zoneinfo/US/Eastern. Java производит неверные результаты для дат между 15 марта 2010 года и 25 апреля. После замены файла символической ссылкой на/usr/share/zoneinfo/US/Eastern, теперь я получаю правильные результаты. Я изумлен, что эта ошибка: a) все еще открыта, b) затрагивает полностью обновленный сервер Ubuntu (9.10 - Karmic). – 2010-03-31 22:25:08

+0

Ошибка отмечена как закрытая в Java версии 7 (b72). – Raedwald 2013-07-20 15:37:17

0

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

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

1

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

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

22

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

$ 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, если/и т.д./МестноеВремя и/и т.д./часовой поясе являются непоследовательным, Java, кажется, читает часовой пояс по умолчанию из/и т.д./часового пояса.