最好在db OffsetDateTime或Instant中保留

mvb*_*b13 2 java postgresql java-time

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

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

cas*_*lin 5

简短答案

根据文档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 |
+--------------------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

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

JDBC 4.2规范似乎并不支持它Instant


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

OffsetDateTimeZonedDateTime并且Instant它们在时间轴上存储的时间点都达到了纳秒级的精度。即时是最简单的,仅表示即时。OffsetDateTime将与UTC /格林威治时间的偏移量添加到瞬间,从而可以获取本地日期时间。ZonedDateTime添加完整的时区规则。

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

  • 虽然 JDBC 4.2 和 4.3 并不“要求”支持“Instant”,但 JDBC 驱动程序实现可以选择支持该类型。对于这样的驱动程序来说,使用“Instant#atOffset(ZoneOffset.UTC)”和“OffsetDateTime#toInstant”来实现转换非常容易。将“Instant”与此类 JDBC 驱动程序一起使用会很方便,但会降低代码的可移植性。 (2认同)