我想将一个时间戳值保存到postgres数据库中。对应的列是TIMESTAMP WITHTIME TIME ZONE的类型。输入的Java应用程序获取纪元时间(长值)后,可以使用ZoneOffset.UTC将其转换为Instant或OffsetDateTime。
什么是最好的方法?这种方法有什么缺点吗?
答案 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紧密一致。请注意,不支持
ZonedDateTime
,Instant
和OffsetTime
/TIME [ WITHOUT TIMEZONE ]
。还要注意,所有OffsetDateTime
实例将都采用UTC(偏移量为0)。这是因为后端将它们存储为UTC。
JDBC 4.2 specification似乎不支持Instant
。
另请参见OffsetDateTime
类文档中的以下引号(重点是我的意思):
OffsetDateTime
,ZonedDateTime
和Instant
都在时间线上存储一个瞬间到纳秒级的精度。即时是最简单的,仅表示即时。OffsetDateTime
将与UTC /格林威治标准时间的偏移量相加,从而可以获取本地日期时间。ZonedDateTime
添加了完整的时区规则。打算在更简单的应用程序中使用
ZonedDateTime
或Instant
为数据建模。 在更详细地建模日期时间概念或与数据库或网络协议进行通信时,可以使用此类。