Для столбцов, основанных на событиях, в моей базе данных, например createdDate, я хочу сохранить значение UTC.
Я ищу совет, если то, что я сейчас делаю, правильно решает мою проблему.
В моем scala (аналогичном java) коде, я создам timestamp как:
val currentMs: Long = System.currentTimeMillis
new java.sql.Timestamp(currentMs)
Я сохраню это значение в базе данных. Все время моего сервера будет синхронизировано. Теперь на уровне базы данных я сохраняю чистое значение UTC.
Когда я получаю данные из базы данных, я буду использовать Joda-Time, который примет значение timestamp из базы данных, а затем преобразует значение в определенный часовой пояс.
Это правильный способ делать UTC? Я что-то пропустил, потому что эта тема сбивает с толку, когда вы об этом говорите :)
Примечание. Это совершенно новый проект, поэтому я могу без проблем изменить ситуацию.
Обновить
На шаге №2 вместо сохранения значения из java.sql.Timestamp, что, если я просто сохранил значение raw currentMs в длинном столбце. Затем в пользовательском интерфейсе я бы преобразовал время unix в определенный часовой пояс на основе зарегистрированного пользователя.
Это подходит?
(a) Поиск StackOverflow, так как это задано и ответили много раз.
(b) Что касается вашего элемента №1: НЕТ, не используйте TIMESTAMP WITHOUT TIME ZONE
. Этот тип данных означает, что Postgres игнорирует любой указанный часовой пояс.
Эксперт Postgres Дэвид Э Уилер советует всегда использовать TIMESTAMP WITH TIME ZONE
(за одним редким исключением).
Прочтите документ внимательно; не предполагайте, как работают типы данных. Названия "с/без часового пояса" являются неверными, поскольку временные метки Postgres никогда не имеют информации о часовом поясе (они оформлены в терминах UTC). Разница между "с/без часового пояса" заключается в том, соблюдаются ли временные зоны/применяются, когда данные вставлены/выбраны.
Поэкспериментируйте немного, чтобы прояснить ваше понимание.
(c) Да, обычно рекомендуется хранить ваши значения даты и времени в UTC при переходе на местное время (часовой пояс) только для презентации.
(d) Postgres имеет функции для фиксации текущего времени. Вы можете вызывать эти функции, а не делать это в коде Java/Scala, где это необходимо.
(e) Не уверен, что вы имели в виду под вторым предложением пункта 3. Если вы имеете в виду часы на компьютерах, почти всегда лучше установить часовой пояс серверов для UTC (или Рейкьявика Исландии). Но ваша база данных и программирование никогда не должны зависеть от этого.
Postgres имеет хорошую поддержку для работы с датами (среди лучших из любой базы данных), но внимательно прочитайте документ, чтобы вы поняли нюансы.
Возможный дубликат Что является наиболее рекомендуемым способом хранения времени в PostgreSQL с помощью Java?
Обратите внимание: postgresql фактически не сохраняет часовой пояс, независимо от имени типа данных.
Также см. Мой блог на http://greybeardedgeek.net/2012/11/24/java-dates/
Да, сохранение миллисов с эпохи в БД и только преобразование их в часовые пояса на местном уровне - хороший подход. Это также позволяет забыть о типах хранения данных о датах и времени и просто хранить миллины в виде числа. Это мой предпочтительный подход, а также крутая вещь: он работает с несколькими типами БД.
AT TIME ZONE t
). Понятия не имею, как все это будет работать с вашими слоями каркаса.