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

标签 java sql jooq

在我的 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 TOME ZONE 的数据库列,您应该使用 InstantOffsetDateTimeZonedDateTime 类。

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

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

关于java - jOOQ 在预期 UTC 时使用本地时区设置时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248548/

相关文章:

sql - MySQL:计算没有分组的条目?

mysql - 在 select 子句 JOOQ 中连接字段

sql - jOOQ 多个表的聚合函数

java - 我可以将 ComboBoxModel 转换为 int 吗?

sql - 持续时间重叠导致重复计算

sql - 如何从 Apache Drill 中的时间戳字段中提取日期部分?

java - 如何修复 :-org:jooq. 异常.DataAccessException 和 com.microsoft.sqlserver.jdbc.SQLServerException?

java - java中如何将int转换为String

java - 使用ArrayList进行用户输入

java - 如何在 Java 中打印字符串数组的偶数和奇数位置字符?