Конвертация даты в спящем режиме - PullRequest
6 голосов
/ 07 сентября 2010

У меня возникла странная проблема, связанная с гибернацией, при настройке поля даты в объекте.Дата интерпретируется как UTC в java-программе (я сделал System.out, чтобы убедиться, что назначенная дата находится в «UTC». Однако, когда hibernate фактически сохраняется в базе данных, дата преобразуется в местное время и сохраняется) ex,значение было установлено в установщике сущностей как «2009-09-09 00:08:08» - GMT фактическое значение, сохраненное в базе данных, - «2009-09-08 08:08:08» - восточное время США.Я не могу выяснить, где и почему это происходит и как это предотвратить.Спасибо

PS Я использую библиотеку дат joda и аннотирую поле с помощью @ org.hibernate.annotations.Type (type = "org.joda.time.contrib.hibernate.PersistentDateTime")

Ответы [ 3 ]

3 голосов
/ 07 сентября 2010

Однако, когда гибернация фактически сохраняется в базе данных, дата преобразуется в местное время и сохраняется) ex.значение было установлено в установщике сущностей как "2009-09-09 00:08:08" - GMT фактическое значение, сохраненное в базе данных, "2009-09-08 08:08:08" - восточное время США.

Хорошо, во-первых, какой бы тип столбца вы не использовали для хранения своей даты в MySQL (TIMESTAMP или DATETIME), также не сохраняет часовой пояс Re: Сохранение часового пояса с указанием даты и времени :

  • TIMESTAMP - секунды с 1970 года, занимающие 4 байта.Хранится в GMT.То есть смещение TZ применяется при сохранении значения, а затем применяется при его получении.(...)

  • DATETIME - это 8-байтовая строка цифр "ггггммдччммсс".(...)

И, во-вторых, если только не ошибочное поведение , я понимаю, что преобразование должно быть выполнено либо сервером, либодрайвер JDBC в зависимости от настроек часового пояса сервера , чтобы вы не получали противоречивые данные.

В обоих случаях я хочу сохранить "2009-09-09 00:08:08 "- GMT или " 2009-09-08 08:08:08 "- восточное время США с Явы должны уступитьтакое же значение в базе данных.

Однако, похоже, что другое преобразование выполняется, когда отображает их.Возникает вопрос: как вы на самом деле проверяли значение «сохраняемой даты».«Проблема» возникает в вашем клиенте SQL?В коде Java?

Ссылки


В документации MySQL для DateTime говорится, что «MySQL извлекает и отображает значения DATETIME в формате« ГГГГ-ММ-ДД ЧЧ: ММ: СС »».Это означает, что mysql преобразует «миллисекунды с эпохи» в вышеуказанный формат.Итак, теперь мой вопрос: информация о часовом поясе также хранится в mysql?

Я обновил свой первоначальный ответ (который не был полностью точным / исчерпывающим).Независимо от того, используете ли вы DATETIME или TIMESTAMP, ответ - нет.

Еще одно замечание, которое я сделал, заключается в том, что вышеупомянутая проблема «конверсии» даты существует, только когда я устанавливаю дату в приложении Java.Если я создаю триггер mysql для обновления / установки даты, используя «UTC_TIMESTAMP ()», дата отображается во времени «UTC».

Функция UTC_TIMESTAMP () всегда возвращает текущие UTC дату и время.


Я хотел бы знать следующее:

  • Как вы "выявили" проблему?С клиентом SQL или из Java?
  • Каков местный часовой пояс JVM?
  • Что такое часовой пояс MySQL Server?
  • Какая версияДрайвер JDBC для MySQL?
  • Не могли бы вы выполнить тест с необработанным JDBC?
1 голос
/ 08 ноября 2016

Чтобы обрабатывать даты как UTC в БД (для чтения / записи), вы можете использовать эту небольшую библиотеку с открытым исходным кодом DbAssist.Он использует пользовательские UtcDateType, чтобы отобразить java.util.Date поля в ваших сущностях, чтобы они обрабатывались Hibernate как UTC в БД.Поскольку вы используете аннотации JPA, вы должны использовать следующую зависимость:

<dependency>
    <groupId>com.montrosesoftware</groupId>
    <artifactId>DbAssist-5.2.2</artifactId>
    <version>1.0-RELEASE</version>
</dependency>

Применение исправления легко, например, при использовании Spring Boot вы должны убедиться, что у вас есть аннотация @EnableAutoConfiguration докласс приложения.Если вы используете другую версию Hibernate, просто обратитесь к github wiki , чтобы найти правильную версию исправления и руководство по установке.Вы также можете прочитать больше о проблеме смещения часового пояса в этой статье .

0 голосов
/ 17 апреля 2011

Такое поведение Joda Time Contrib исправлено в моем проекте Usertype для Joda Time и JSR310.См. http://usertype.sourceforge.net/, что практически является заменой JodaTime Hibernate.

Я писал об этой проблеме: http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

Надеюсь, это поможет,

Chris

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