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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
33
0
41 706
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Обновлено: в команды добавлено «sudo».

+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 01.04.2010 02:25

Ошибка отмечена как закрытая в Java версии 7 (b72).

Raedwald 20.07.2013 19:37

Замена / etc / localtime на символическую ссылку; вы можете ожидать, что что-то сломается в более современных системах Linux (например, при обновлении пакетов или, возможно, при запуске - я подозреваю, что причина перехода с символической ссылки на копию файла связана с последовательностью запуска и зависимостями ( особенно если / usr / находится в другой файловой системе). Я считаю более полезным установить переменную окружения TZ.

Cameron Kerr 01.09.2014 14:13

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

/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, однако tomcat не распознает, что DST действует. В качестве обходного пути я изменил Australia/Sydney (GMT + 10: 00) на Pacific/Numea (GMT + 11: 00), чтобы время отображалось правильно, однако мне хотелось бы узнать фактическое решение или ошибку, если таковая имеется.

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

Прекрасно работает на Ubuntu 10.0.4 LTS. Тоже немного лучше. Я просто запустил sudo dpkg-reconfigure tzdata и смог выбрать правильный часовой пояс в интерфейсе.

msung 11.07.2012 16:10

dpkg-reconfigure tzdata - это именно то, что я искал. Спасибо!

Dinesh Reddy Parne 09.05.2014 23:58

Просто столкнулся с этой проблемой в lubuntu 16.04 (gnome). Это решение сработало как шарм.

7yl4r 30.03.2017 20:55

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

sudo timedatectl set-timezone UTC

Другие вопросы по теме