我想将时间戳值保存到 PostgreSQL 数据库中。相应的列的类型为
TIMESTAMP WITHOUT TIME ZONE
。
当输入 Java 应用程序获取纪元时间(
long
值)时,可以使用 Instant
将其转换为 OffsetDateTime
或 ZoneOffset.UTC
。
最好的方法是什么?这种方法有什么缺点吗?
根据 PostgreSQL JDBC 驱动程序文档,不支持
Instant
。但在 UTC 中,您不应该遇到 OffsetDateTime
的问题。
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 ]
实例都将采用 UTC(偏移量为 0)。这是因为后端将它们存储为 UTC。OffsetDateTime
以及 JDBC 4.2 规范提到对
Instant
的支持。
OffsetDateTime
类文档中的以下引用(重点是我的):
、OffsetDateTime
和ZonedDateTime
都以纳秒精度存储时间线上的瞬间。 Instant是最简单的,简单的代表瞬间。Instant
添加与 UTC/格林威治的偏移量,这样就可以获取本地日期时间。OffsetDateTime
添加完整的时区规则。ZonedDateTime
或ZonedDateTime
旨在用于在更简单的应用程序中对数据进行建模。 在更详细地建模日期时间概念时,或者在与数据库或网络协议中通信时,可以使用此类。Instant