我想把时间戳值保存到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非常一致。请注意,不支持
ZonedDateTime
、Instant
和OffsetTime
/TIME [ WITHOUT TIMEZONE ]
。还要注意,所有OffsetDateTime
的实例都将使用UTC格式(偏移量为0)。这是因为后端将它们存储为UTC。JDBC 4.2 specification似乎不支持
Instant
。另请参阅
OffsetDateTime
类文档中的以下引用(highlight is mine):OffsetDateTime
、ZonedDateTime
和Instant
都以纳秒精度在时间线上存储一个瞬间。瞬间是最简单的,只代表瞬间。OffsetDateTime
将与UTC/Greenwich的偏移量相加,从而获得本地日期时间。ZonedDateTime
添加完整时区规则。其目的是
ZonedDateTime
或Instant
用于在更简单的应用程序中建模数据。当更详细地建模日期时间概念时,或者当与数据库或网络协议通信时,可以使用该类。关于java - 最好在db OffsetDateTime或Instant中保留,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58434148/