Проблемы с часовым поясом при использовании java.util.Date при записи в Oracle

Настраивать

  • Веб-приложение работает на машине A с системным временем, установленным на GMT.
  • База данных Oracle работает на машине B с системным временем, установленным по Гринвичу. (выберите dbtimezone из двух показаний +0:00)

Проблема

Веб-приложение использует Hades JPA и Hibernate для записи и чтения из БД. В таблице есть два столбца типа timestamp с именами CREATED и MODIFIED. Веб-приложения используют joda DateTime для получения объекта java.util.Date и записи его в БД. Все в порядке при первом создании записи, время в обоих полях установлено по Гринвичу. Но как только эта же строка обновляется, столбец MODIFIED устанавливается в PST.

Это тот же раздел кода, который выполняется для установки значений даты во время создания, а также во время модификации (он пытается получить java.util.Date из joda DateTime, как упоминалось выше).

Может кто-нибудь объяснить такое поведение?

Еще одна вещь, которую я заметил, заключается в приведенной выше настройке, если в веб-приложении я устанавливаю столбец даты с помощью новой даты(), он устанавливает его в PST. Я понятия не имею, где он получает часовой пояс как PST, когда приложение и БД работают на машинах, настроенных на GMT.

РЕДАКТИРОВАТЬ: TimeZone.getDefault() печатает GMT на обеих машинах.


person Prasanna    schedule 02.03.2011    source источник


Ответы (1)


Проверьте, в каком часовом поясе JVM работает, вызвав java.util.TimeZone.getDefault(). Это будет часовой пояс, который он применяет к дате, когда он читается из вашего драйвера jdbc. Хотя я использовал спящий режим, я не уверен, что он настраивается в часовом поясе. Тем не менее, я бы сказал, что под капотом он звонит java.sql.ResultSet.getDate(). Эта функция имеет перегрузку getDate(String columnLabel, Calendar cal), которая позволяет указать часовой пояс столбца, который она считывает из базы данных. Это, вероятно, основная причина проблемы. Если Hibernate вызывает значение по умолчанию, хотя getDate(String columnLabel), то, скорее всего, проблема заключается в часовом поясе, который, по мнению вашей JVM, не является GMT.

person Melv    schedule 02.03.2011
comment
Да, забыл упомянуть, что TimeZone.getDefault() печатает GMT на обеих машинах. - person Prasanna; 02.03.2011
comment
И если вы toString дату, когда вы читаете ее обратно из базы данных, говорит ли часовой пояс по Гринвичу? - person Melv; 02.03.2011