2017-01-24 7 views
2

Добрый день,
Я создаю службу веб-приложений, которая будет использоваться во всем мире.
Поэтому мне нужно хранить значения datetime в UTC и представлять их в часах на стене до конечного пользователя.
После прочтения переполнение стека, я понял, что я должен:
ZonedDateTime устойчивость к базе данных SQL

  1. использование временной метки в качестве типа столбца в БД (в настоящее время MariaDB 10.1.20)
  2. использования ZonedDateTime в Java (я использую java8)

Проблема возникла при преобразовании этих значений.
Как я использую JDBC, я должен сделать следующее преобразование:

java.sql.Timestamp <-> java.time.ZonedDateTime 

Мой код:

// Get current zonedDateTime 
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC); 

// Convert zonedDateTime to java.sql.Timestamp before saving to DB 
Timestamp = Timestamp.from(zonedDateTime.toInstant()); 

// Get zonedDateTime from resultSet 
Timestamp timestamp = (Timestamp) resultSet.getObject("created"); 
ZonedDateTime zonedDateTime = 
    ZonedDateTime.ofInstant(ts.toInstant(), ZoneOffset.UTC)) 

Когда я использую:

zonedDateTimeBeforeSave.isEqual(zonedDateTimeAfterSave); 

Это возвращает меня ложь (Мне нужно сравнить их в переопределенном равном методе моей модели домена)
Ниже печать из обоих:

zonedDateTimeBeforeSave: 2017-01-24T20: 18: 17.720Z
zonedDateTimeAfterSave: 2017-01-24T20: 18: 17Z

Вопросы:

  1. Я прямо в своем выборе. Возможно, я должен использовать другой столбец или тип java ...
  2. Я правильно занимаюсь преобразованиями. Может быть, есть еще один лучший способ

Спасибо вам

  1. Edit: После помощи Мэтта Джонсона я понял, что проблема заключается в том, что при сохранении DateTime к БД, это не спасает фракций, хотя и должно. Тип столбца FYI - это метка времени (6).
  2. Edit: Теперь я использую java.time.Instant вместо ZonedDateTime
+1

Оставляя в стороне недостающую вторую проблему, почему вы не используете 'Instant' для хранения временных меток как UTC? –

+0

Я только что сделал это рано утром, хотя был в сомнениях. Вы удалили их по вашему вопросу, спасибо. Я не хотел редактировать свой ответ, поскольку он не влияет на дробное поведение и все еще хотел увидеть другие предложения, касающиеся типа, например, как вы писали. – Sabine

ответ

1

я, наконец, узнал, что была проблема после прочтения этого поста и комментарии:

http://mysqlnoob.blogspot.com/2016/09/replication-from-mysql-56-to-mariadb-10-fails-with-fractional-seconds.html

Причиной был мой водитель MariaDB JDBC
У меня была старая версия 1.1.7 и параметр «useFractionalSeconds» был установлен на false.
Решение скорее устанавливает этот параметр в значение true (f.ex по URL) или обновляет драйвер. Текущая последняя версия - 1.5.7 по состоянию на 25.01.2017

+1

Это отличная находка. Спасибо, что поделился! Не забудьте принять свой собственный ответ (один раз через 48 часов он должен позволить вам). –

0

MySQL добавлена ​​поддержка дробных секунд с версии 5.6.4. Я предполагаю, что вы работаете с чем-то старше этого, и поэтому ваши миллисекунды усекаются.

С MySQL 5.6 документов:

До MySQL 5.6.4, экземпляры ограничены, в которых дробная часть секунд разрешена во временных значениях. Заключительная дробная часть допустима в таких контекстах, как литералы, а также в аргументах или возвращаемых значениях некоторых временных функций. ...Однако, когда MySQL сохраняет значение в столбец любого временного типа данных, удаляет любую дробную часть и не сохраняет ее.

MySQL 5.6.4 и up расширяет дробную секундную поддержку для TIME, DATETIME и TIMESTAMP значений с точностью до микросекунд (6 цифр). ...

Если вы хотите, сравнить изменения в этом доке из версий 5.5, 5.6 и 5.7.

+0

Нет, я использую MariaDB 10.1.20 (Да, я был немного не точен относительно моей БД). В любом случае MariaDB включал фракции с 5.3, за пару месяцев до того, как MySQL сделал. – Sabine

+0

О, хорошо. Пожалуйста, добавьте это к вопросу, и я удалю это. –

+0

Не волнуйтесь, я ценю любой ответ. Более того, может быть, вы можете помочь мне в выборе моего выбора? Я сделал правильный выбор? Я имею в виду типы? – Sabine

 Смежные вопросы

  • Нет связанных вопросов^_^