Изменить временную зону временной метки в результате соединения с запросом jdbc - PullRequest
1 голос
/ 26 июня 2019

Я использую Redshift и JDBC. Часовой пояс сервера красного смещения show timezone; - UTC. Часовой пояс моего приложения (jvm) +2.

Когда я выполняю запрос через jdbc, выберите SYSDATE; Я получил правильную метку времени с правильным значением в UTC, но, к сожалению, часовой пояс этого значения равен +2.

Например: Сервер имеет 2019-06-26T18:10:13.000+0-00, но я получил 2019-06-26T18:10:13.000+0200.

После этого я с помощью Джексона сопоставил метку времени с json и отправил ответ клиенту, и клиент получил неверное значение 2019-06-26T16: 10: 13.000 + 0000.

Я не могу изменить часовой пояс для приложения и картографа.

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Мне кажется, что драйвер JDBC не имеет параметра для установки часового пояса клиента. Это аналогичный вопрос для postgres (и красные смещения и postgres, скорее всего, поделятся особенностями / проблемами).

Вариант 1 - изменить часовой пояс JVM клиента

Так что, если это вариант для вас, похоже, что вы можете изменить настройку часового пояса в JVM, поскольку клиент JDBC использует часовой пояс клиента в соединении.

AddVMOption -Duser.timezone=UTC

Вариант 2 - отправить SET SESSION TIME ZONE перед запросом

Я знаю, что в psql вы можете контролировать часовой пояс клиента, установив переменную окружения PGTZ (я использовал ее для подключенияв Redshift и получал TIMESTAMP WITHOUT TIME ZONE в нужной форме. В этой документации postgres говорится:

  • Переменная среды PGTZ используется клиентами libpq для отправки зоны SET TIME ZONEКоманда на сервер при подключении.

Возможно, это будет вариант всегда отправлять SET TIME ZONE UTC (см. Redshift настройки часового пояса документы ) при открытии сеанса JDBC,или перед каждым запросом.

1 голос
/ 26 июня 2019

Необходимо указать дату в формате UTC, указав TimeZone с использованием метода getTimestamp(String columnLabel, Calendar cal):

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

Timestamp ts = resultset.getTimestamp("TimestampColumn", cal);

Как говорит Javadoc:

Этот метод использует данный календарь для создания подходящего значения миллисекунды для метки времени, если базовая база данных не хранит информацию о часовом поясе.

...