Как настроить TimeZone Postgre SQL и Tomcat

ТехнологииВнимание! Техническая статья.

Обнаружили тут одну интересную особенность в нашей программе. Неправильно показывает время. Не сильно так, а всего на час разницы.  Это все последствие отмены перехода с летнего времени на зимнее и обратно. Мы-то можем перейти очень просто. Подкрутил стрелочку на часах и все, больше ничего не нужно. А вот компьютеры у нас умные. Они сами стараются переходить с летнего на зимнее и обратно.

Поскольку сейчас переходить никуда не нужно, то и компьютерам тоже нужно сказать об этом. Но… как всегда вмешивается одно или второе “но”.  Компьютеры и серверы мы просто перевели, а вот программа, почему-то отказывается переводиться.

В программе у нас простая цепочка. На локальном компьютере работает клиентская программа под Windows, которая отображает данные, получаемые с Web сервиса Tomcat (установлен на Centos), написанного на Java, а этот Web сервис хранит данные в базе Postgre SQL.

Цепочка такая  Windows_программа<-Java Web Service<-Postgre SQL

Кто из них показывает неправильный часовой пояс?

Локальное время на рабочей станции правильное, т.е. время не с рабочей станции показывается.

Проверяем на сервере, время тоже правильное.

Проверяем Postgre SQL

Можно посмотреть время командой

SELECT now();

Если выводимое время отличается от времени сервера, значит либо в базе данных настроен неправильный часовой пояс, либо у самого пользователя в настройках стоит неправильный часовой пояс. Postgree SQL  позволяет на базу данных поставить один часовой пояс, а разные пользователи могут подключаться из разных часовых поясов и у них будет отображаться время в соответствии с их часовым поясом.

Проверяем в базе данных mybase

psql -c ‘show timezone’ mybase

или подключившись к базе

show timezone

Посмотреть какие есть timezone

SELECT * FROM pg_timezone_names;

Изменить в таблице mytable на Москву

ALTER DATABASE mytable SET timezone TO ‘W-SU';

Изменить у пользователя myuser

ALTER ROLE myuser   SET TimeZone = ‘W-SU';

После этого перезайти под пользователем и проверить

SELECT now();

Если показывает время правильно, то здесь закончили, переходим к TomCat

Здесь нужно в файле, который находится в каталоге сервера /bin/catalina.sh

прописать где-нибудь в начале следующее

TOMCAT_TIMEZONE=”-Duser.timezone=UTC-3″
CATALINA_OPTS=”$CATALINA_OPTS $TOMCAT_TIMEZONE”

и перезапустить TomCat

 

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>