jOOQ 在预期 UTC 时使用本地时区设置时间戳

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

在我的 jOOQ 配置文件中我有这一行:

<javaTimeTypes>true</javaTimeTypes>

如果我在 HSQLDB 中创建此表:

CREATE TABLE T1 (C1 TIMESTAMP DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP NOT NULL);

生成的jOOQ代码是这样的:

public final TableField<T1Record, LocalDateTime> C1 =
createField("C1", org.jooq.impl.SQLDataType.LOCALDATETIME.nullable(false).
defaultValue(org.jooq.impl.DSL.field("LOCALTIMESTAMP",
org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "");

我的 JVM 从 CET 时区开始,无论我在创建

DSLContext
之前是否将其设置为 GMT,在插入或更新行时(没有显式设置值)jOOQ 始终使用 CET 时区。

直接使用 JDBC 时,时间戳会插入 GMT,这就是我想要的。
如何配置jOOQ才能达到同样的效果?

我正在使用 IntelliJ IDEA 检查数据库内容。

java sql jooq
1个回答
0
投票

您使用了错误的数据类型。

LocalDateTime
不能代表时刻。 它只是日期和一天中的时间,没有时区或与 UTC 的偏移量。

对于类似于 SQL 标准类型

TIMESTAMP WITH TIME ZONE
的数据库列,您应该使用
Instant
OffsetDateTime
ZonedDateTime
类之一。

Stack Overflow 上已经对此进行了多次介绍。搜索了解更多。

请勿编写依赖于 JVM 或数据库当前默认时区的代码。通过显式传递可选参数来指定所需/预期的区域或偏移量。

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