最好在db OffsetDateTime或Instant中保留

时间:2019-10-17 13:44:27

标签: java postgresql java-time

我想将一个时间戳值保存到postgres数据库中。对应的列是TIMESTAMP WITHTIME TIME ZONE的类型。输入的Java应用程序获取纪元时间(长值)后,可以使用ZoneOffset.UTC将其转换为Instant或OffsetDateTime。

什么是最好的方法?这种方法有什么缺点吗?

1 个答案:

答案 0 :(得分:5)

简短答案

根据documentation,不支持Instant。但是您不应该在UTC中遇到OffsetDateTime的问题。

长答案

PostgreSQL JDBC documentation提到TIMESTAMP [ WITHOUT TIMEZONE ]的对应类型是LocalDateTime,但是还支持UTC中的OffsetDateTime。另一方面,不支持Instant

请参见下面的引言:

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

这与JDBC 4.2规范的表B-4和B-5紧密一致。请注意,不支持ZonedDateTimeInstantOffsetTime / TIME [ WITHOUT TIMEZONE ]。还要注意,所有OffsetDateTime实例将都采用UTC(偏移量为0)。这是因为后端将它们存储为UTC。

JDBC 4.2 specification似乎不支持Instant


另请参见OffsetDateTime类文档中的以下引号(重点是我的意思):

  

OffsetDateTimeZonedDateTimeInstant都在时间线上存储一个瞬间到纳秒级的精度。即时是最简单的,仅表示即时。 OffsetDateTime将与UTC /格林威治标准时间的偏移量相加,从而可以获取本地日期时间。 ZonedDateTime添加了完整的时区规则。

     

打算在更简单的应用程序中使用ZonedDateTimeInstant为数据建模。 在更详细地建模日期时间概念或与数据库或网络协议进行通信时,可以使用此类。