我想把时间戳值保存到postgres数据库中。对应列的类型为TIMESTAMP,不带时区。当输入java应用程序获得epoch time(长值)时,可以使用ZoneOffset.UTC将其转换为Instant或OffsetDateTime。
什么是最好的方法?这种方法有什么缺点吗?

最佳答案

简短的回答
根据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 |
+--------------------------------+----------------+

这与JDBC4.2规范的表B-4和表B-5非常一致。请注意,不支持ZonedDateTimeInstantOffsetTime/TIME [ WITHOUT TIMEZONE ]。还要注意,所有OffsetDateTime的实例都将使用UTC格式(偏移量为0)。这是因为后端将它们存储为UTC。
JDBC 4.2 specification似乎不支持Instant
另请参阅OffsetDateTime类文档中的以下引用(highlight is mine):
OffsetDateTimeZonedDateTimeInstant都以纳秒精度在时间线上存储一个瞬间。瞬间是最简单的,只代表瞬间。OffsetDateTime将与UTC/Greenwich的偏移量相加,从而获得本地日期时间。ZonedDateTime添加完整时区规则。
其目的是ZonedDateTimeInstant用于在更简单的应用程序中建模数据。当更详细地建模日期时间概念时,或者当与数据库或网络协议通信时,可以使用该类。

关于java - 最好在db OffsetDateTime或Instant中保留,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58434148/

10-11 20:42