Что лучше сохранить в db OffsetDateTime или Instant - PullRequest
2 голосов
/ 17 октября 2019

Я хочу сохранить значение метки времени в базе данных postgres. Соответствующий столбец имеет тип TIMESTAMP БЕЗ ВРЕМЕННОЙ ЗОНЫ. Поскольку входное Java-приложение получает время эпохи (длинное значение), которое может быть преобразовано в Instant или OffsetDateTime с ZoneOffset.UTC.

Каков наилучший подход? Есть ли недостатки этого метода?

1 Ответ

5 голосов
/ 17 октября 2019

Краткий ответ

Согласно документации , Instant не поддерживается. Но у вас не должно быть проблем с OffsetDateTime в UTC.

Длинный ответ

В документации PostgreSQL JDBC упоминается, что соответствующий тип дляTIMESTAMP [ WITHOUT TIMEZONE ] - это LocalDateTime, но OffsetDateTime в UTC также поддерживается. С другой стороны, Instant не поддерживается.

См. Приведенную ниже цитату:

+--------------------------------+----------------+
| PostgreSQL™                    | Java SE 8      |
+--------------------------------+----------------+
| DATE                           | LocalDate      |
| TIME [ WITHOUT TIMEZONE ]      | LocalTime      |
| TIMESTAMP [ WITHOUT TIMEZONE ] | LocalDateTime  |
| TIMESTAMP WITH TIMEZONE        | OffsetDateTime |
+--------------------------------+----------------+

Это тесно связано с таблицами B-4и B-5 спецификации JDBC 4.2. Обратите внимание, что ZonedDateTime, Instant и OffsetTime / TIME [ WITHOUT TIMEZONE ] не поддерживаются. Также обратите внимание, что все экземпляры OffsetDateTime будут в UTC (со смещением 0). Это связано с тем, что бэкэнд сохраняет их как UTC.

Спецификация JDBC 4.2 не поддерживает Instant.


Также см. Следующую цитату из документации класса OffsetDateTime (выделено мое):

OffsetDateTime, ZonedDateTime и Instant все магазинымгновение на временной шкале с точностью до наносекунды. Мгновенное является самым простым, просто представляющим момент. OffsetDateTime добавляет к моменту смещение от UTC / Гринвич, что позволяет получить местную дату и время. ZonedDateTime добавляет полные правила часовых поясов.

Предполагается, что ZonedDateTime или Instant используется для моделирования данных в более простых приложениях. Этот класс может использоваться при более подробном моделировании концепций даты и времени, либо при обмене данными с базой данных или в сетевом протоколе.

...