Часовой пояс 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 об использовании Pacific со всей соответствующей информацией о летнем времени? Время на моем компьютере отображается правильно, поэтому это не является ошибкой конфигурации всей ОС.


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

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


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

8.08.2008 21:24:01
4 ОТВЕТА
РЕШЕНИЕ

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

26
9.08.2008 00:46:46
+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 я теперь получаю правильные результаты. Я поражен, эта ошибка а) все еще открыта, б) затрагивает полностью обновленный сервер Ubuntu (9.10 - Karmic).
Mark Renouf 31.03.2010 22:25:08
Ошибка отмечена как закрытая в Java версии 7 (b72).
Raedwald 20.07.2013 15:37:17
Изменение / etc / localtime на символическую ссылку; Вы можете ожидать, что все сломается в более современных системах Linux (например, когда пакеты обновляются или, возможно, при запуске - я подозреваю, что причина перехода с символической ссылки на копию файла будет связана с последовательностью запуска и зависимостями ( особенно если / usr / находится в другой файловой системе.) Я считаю более полезным установить переменную окружения TZ.
Cameron Kerr 1.09.2014 10:13:21

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

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

0
9.08.2008 01:01:17

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

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

2
24.10.2017 11:57:24

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

25
12.10.2010 08:15:01
Работает как шарм на Ubuntu 10.0.4 LTS. Несколько приятнее тоже. Я просто запустил sudo dpkg -configure tzdata и смог выбрать правильный часовой пояс во внешнем интерфейсе.
msung 11.07.2012 12:10:09
dpkg-reconfigure tzdata был именно тем, что я искал. Спасибо!
Dinesh Reddy Parne 9.05.2014 19:58:24
Просто столкнулся с этой проблемой в lubuntu 16.04 (гном). Это решение работает как шарм.
7yl4r 30.03.2017 17:55:29