java - 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 检查数据库内容。
解决方案
您使用了错误的数据类型。LocalDateTime
不能代表片刻。它只是一个日期和一天中的时间,没有时区或与 UTC 的偏移量。
对于类似于 SQL 标准类型的数据库列TIMESTAMP WITH TOME ZONE
,您应该使用Instant
、OffsetDateTime
或ZonedDateTime
类。
这已经在 Stack Overflow 上讨论过很多次了。搜索以了解更多信息。
不要编写代码以依赖于 JVM 或数据库的当前默认时区。通过显式传递可选参数来指定所需/预期的区域或偏移量。
推荐阅读
- python-3.x - 为多类 ML 分类模型选择信息量最大的分类特征
- angularjs - ng-class not working in one situation. What are some possible cause of this?
- f# - My F# code cannot read XML using XSD template
- html - 如何在文本覆盖扩展时扩展图像?
- oracle - 当我尝试运行我编写的 Oracle 存储过程时,出现 ORA-00933:SQL 命令未正确结束错误
- c# - MVVM 应用程序中用户配置数据的实用管理
- javascript - JS - 给定对象数组,我可以返回一个仅包含选定属性的数组吗?
- javascript - JavaScript 中的 Snake:我的蛇尾巴不能再长了
- python - 如何在同一个图上很好地缩放图形和向量场?[奇怪的鳞片]
- jquery - JQuery 函数在初始 getJSON 加载时未找到检查