【问题标题】:jOOQ sets timestamps with local time zone when UTC was expectedjOOQ 在预期 UTC 时使用本地时区设置时间戳
【发布时间】:2019-10-08 10:53:23
【问题描述】:

在我的 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 检查数据库内容。

【问题讨论】:

  • 数据库在哪个时区运行?您能否展示代码如何使用 jOOQ 和 JDBC 获取数据?
  • 数据库以嵌入式模式运行,位于 CET 时区。我正在通过 IntelliJ IDEA 检查数据库内容。 jOOQ 和原始 JDBC 之间的区别在于数据的写入方式。 jOOQ 使用 CET 时区设置当前值,而我预计它是 GMT,就像原始 JDBC 一样。我编辑了问题以反映这些额外的细节。
  • 谢谢,但你能显示实际的代码吗?否则,很难知道“原始 JDBC”是什么意思。或者,如果您认为自己发现了错误,您可以提交问题并附上 MCVE 以帮助重现问题:github.com/jOOQ/jOOQ-mcve

标签: java sql jooq


【解决方案1】:

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

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

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

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

【讨论】:

  • 选择LocalDateTime的是jOOQ。显然是正确的,因为我不需要偏移量。如问题中所述。
猜你喜欢
  • 2017-07-04
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2011-08-22
  • 2015-04-20
  • 2017-04-23
  • 2019-08-15
相关资源
最近更新 更多