首页 > 解决方案 > jOOQ 在预期 UTC 时使用本地时区设置时间戳

问题描述

在我的 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 时区开始,无论我在创建之前是否将其设置为 GMT DSLContext,当插入或更新行(没有明确设置值)时,jOOQ 总是使用 CET 时区。

当直接使用 JDBC 时,时间戳会插入到 GMT 中,这就是我想要的。
如何配置 jOOQ 以获得相同的效果?

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

标签: javasqljooq

解决方案


您使用了错误的数据类型。LocalDateTime不能代表片刻。它只是一个日期和一天中的时间,没有时区或与 UTC 的偏移量。

对于类似于 SQL 标准类型的数据库列TIMESTAMP WITH TOME ZONE,您应该使用InstantOffsetDateTimeZonedDateTime类。

这已经在 Stack Overflow 上讨论过很多次了。搜索以了解更多信息。

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


推荐阅读