Проблемы с часовым поясом при использовании java.util.Date при записи в Oracle - PullRequest
2 голосов
/ 02 марта 2011

Настройка

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

Проблема

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

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

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

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

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

1 Ответ

2 голосов
/ 02 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...