У меня две услуги. Вот некоторая информация, которая верна для обеих служб. Язык: 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 ".
- Всегда ли это утверждение верно?
- Если вы правильно ответили на вышеупомянутый вопрос, сервис 3, похоже, противоречит этому. Как вы это объясните?
- Зависит ли от реализации драйвера JDB C определение часового пояса, что означает, что часовой пояс JVM не всегда может преобладать?
Примечание: 1-й и третий вопрос - ДА / НЕТ. Будет здорово, если вы начнете свой ответ с ДА / НЕТ, а затем перейдете к деталям.