Несогласованное поведение JDB C при работе с часовыми поясами - PullRequest
0 голосов
/ 28 мая 2020

У меня две услуги. Вот некоторая информация, которая верна для обеих служб. Язык: Java ORM: mybatis - они взаимодействуют с БД, используя этот фреймворк. БД: Oracle.

Цель: Insert time in 'created_date' column in DB in UTC timezone.

В обоих сервисах установлено Timezone.setDefault(Timezone.get("UTC")). Кроме этой строки, мы нигде не устанавливаем часовые пояса в сервисах. Эта строка устанавливает часовой пояс JVM по умолчанию. Затем мы пытаемся вставить в БД, используя mybatis.save(record). Created_date имеет тип java .util.Date в обоих случаях. Столбец в БД имеет TIMESTAMP WITH TIMEZONE для обоих. В сервисе 1 это работает ... если время отправки - 15:00 UT C, столбец created_date в БД показывает 15:00 UT C. Но в службе 2 в то же время 15:00 Азия / Калькутта. Обратите внимание на изменение часового пояса. часть numeri c верна.

Для обеих баз данных DBtimezone = America/Montreal, sessiontimeZone = Asia/Calcutta.

Я знаю, что использование java .util.Date неприятно при работе с часовыми поясами, и у нас есть использовать java.time -классы, но мне любопытно узнать причину такого непоследовательного поведения.

И поведение в сервисе 3 (другой сервис, чей dbtimezone - UT C, а sessiontimezone - Asia / Calcutta) еще больше мутит воду. В сервисе 3 - я пытаюсь вставить 15:00 Австралия / Перт (AWST), но в БД это 15:00 (UT C). Это должно было занять либо время, указанное мной (UT C), либо пользователем (часовой пояс сеанса, который является Азией / Калькуттой), но здесь потребовалось UT C. UT C не является ни часовым поясом JVM, ни часовым поясом пользователя или сеанса.

Похоже, фреймворки, такие как Hibernate и Mybatis, делегируют JDB C для определения часового пояса.

Это приводит нас к - Заявлению: «Если мы не заставим фреймворк или JDB C чтобы взять часовой пояс, в качестве часового пояса по умолчанию всегда будет использоваться часовой пояс JVM ".

  1. Всегда ли это утверждение верно?
  2. Если вы правильно ответили на вышеупомянутый вопрос, сервис 3, похоже, противоречит этому. Как вы это объясните?
  3. Зависит ли от реализации драйвера JDB C определение часового пояса, что означает, что часовой пояс JVM не всегда может преобладать?

Примечание: 1-й и третий вопрос - ДА / НЕТ. Будет здорово, если вы начнете свой ответ с ДА / НЕТ, а затем перейдете к деталям.

...