在我的 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 检查数据库内容。
您使用了错误的数据类型。
LocalDateTime
不能代表时刻。 它只是日期和一天中的时间,没有时区或与 UTC 的偏移量。
对于类似于 SQL 标准类型
TIMESTAMP WITH TIME ZONE
的数据库列,您应该使用 Instant
、OffsetDateTime
或 ZonedDateTime
类之一。
Stack Overflow 上已经对此进行了多次介绍。搜索了解更多。
请勿编写依赖于 JVM 或数据库当前默认时区的代码。通过显式传递可选参数来指定所需/预期的区域或偏移量。