在数据库中持久化哪个更好:OffsetDateTime 还是 Instant?

问题描述 投票:0回答:1

我想将时间戳值保存到 PostgreSQL 数据库中。相应的列的类型为

TIMESTAMP WITHOUT TIME ZONE

当输入 Java 应用程序获取纪元时间(

long
值)时,可以使用
Instant
将其转换为
OffsetDateTime
ZoneOffset.UTC

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

java postgresql java-time
1个回答
11
投票

简短回答

根据 PostgreSQL JDBC 驱动程序文档,不支持

Instant
。但在 UTC 中,您不应该遇到
OffsetDateTime
的问题。


长答案

PostgreSQL JDBC 驱动文档提到

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 规范提到对

Instant
的支持。


另请参阅

OffsetDateTime
类文档中的以下引用(重点是我的):

OffsetDateTime
ZonedDateTime
Instant
都以纳秒精度存储时间线上的瞬间。 Instant是最简单的,简单的代表瞬间。
OffsetDateTime
添加与 UTC/格林威治的偏移量,这样就可以获取本地日期时间。
ZonedDateTime
添加完整的时区规则。

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

© www.soinside.com 2019 - 2024. All rights reserved.