Jooq LocalDateTime 字段使用系统时区而不是会话时区

2024-01-07

我正在使用 jooq (v3.11.9) 访问以 UTC 时间运行的 MySQL 数据库。我使用生成的实体并使用 JSR-310 时间类型。我在配置中使用的选项:

<javaTimeTypes>true</javaTimeTypes>

我的理解是MySQLdatetime and timestamp类型都映射到LocalDateTime这是有道理的,因为 MySQL 不存储时区信息和时间。但是,当我在不同时区的计算机上运行查询时(在我的例子中是东部时间),日期都在我的本地计算机时区中即使会话时区是 UTC.

我已确认会话时区是 UTC

dslContext.fetch("SELECT @@system_time_zone,  @@global.time_zone, @@session.time_zone;")

returns

|@@system_time_zone|@@global.time_zone|@@session.time_zone|
+------------------+------------------+-------------------+
|UTC               |SYSTEM            |SYSTEM             |
+------------------+------------------+-------------------+

时区转换示例:

dslContext.select(MY_TABLE.EPOCH_DT_TM, MY_TABLE.CREATION_TIMESTAMP).from(MY_TABLE).limit(1).fetch()

+-----------------------+-----------------------+
|epoch_dt_tm            |creation_timestamp     |
+-----------------------+-----------------------+
|2019-04-18T13:57:39.163|2019-09-24T16:06:47.754|
+-----------------------+-----------------------+
// CAST to STRING PROPERLY USES SESSION TIMEZONE 
dslContext.select(MY_TABLE.EPOCH_DT_TM.cast(org.jooq.impl.SQLDataType.VARCHAR(100)), MY_TABLE.CREATION_TIMESTAMP.cast(org.jooq.impl.SQLDataType.VARCHAR(100))).from(MY_TABLE).limit(1).fetch()
+--------------------------+--------------------------+
|cast                      |cast                      |
+--------------------------+--------------------------+
|2019-04-18 17:57:39.163000|2019-09-24 20:06:47.754000|
+--------------------------+--------------------------+

我生成的实体中的字段:

    public final TableField<MyTableRecord, LocalDateTime> EPOCH_DT_TM = createField("epoch_dt_tm", org.jooq.impl.SQLDataType.LOCALDATETIME, this, "");
    public final TableField<MyTableRecord, LocalDateTime> CREATION_TIMESTAMP = createField("creation_timestamp", org.jooq.impl.SQLDataType.LOCALDATETIME.nullable(false).defaultValue(org.jooq.impl.DSL.field("CURRENT_TIMESTAMP(6)", org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "");

所以我的问题是:

  1. 这是预期的行为吗?记录不应该填充表中的原始(非时区)日期吗?由于某种原因,日期是否仍在幕后转换为 java.sql.Timestamp ?

  2. 如果这是预期的行为,有什么方法可以确保您获得会话时区中的日期无论客户端计算机上的本地时区如何?如果代码的行为依赖于机器时区,则很难在本地进行测试。

预先感谢您的帮助。


我最近发现,根据所使用的数据库驱动程序,jOOQ 在日期时间解析中可能会表现出一些奇怪的行为。jOOQ 将偏移日期时间返回为 Z (UTC),即使它不是 https://stackoverflow.com/questions/57793193/jooq-returns-offset-date-time-as-z-utc-even-though-its-not/57805713#comment102048607_57805713

具体来说,就我而言,使用不同的 Postgres 驱动程序会导致 DefaultBinding.java 接收具有时间戳的日历对象,但对其调用 toString 以便进行解析。事实证明,toString 不打印时区,然后 jOOQ 推断它是当地时间。

对我来说,DefaultBinding.java 中的违规行(我使用的是带时区的时间戳)是:

else if (type == OffsetDateTime.class) {
    result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
}

由于没有时区,您可能在该系列的 else if 中处于不同的行。

在我的测试中,我还发现更改系统时间会改变结果,但更改会话时间没有任何作用。

对我来说幸运的是,切换到标准 Postgres 驱动程序解决了这个问题。如果没有,我将考虑重载 OffsetDateTime 的绑定来修复 toString 的使用及其相关时区的关联剥离。不幸的是,您可能需要走这条路,除非您也使用可以升级或替换的 SQL 驱动程序。或者,您可以将其与时区一起存储,然后在从数据库加载时转换为所需的时区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jooq LocalDateTime 字段使用系统时区而不是会话时区 的相关文章

  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 如何在 join 语句中进行计数

    我有桌子post int post id varchar title text content和表comment int comment id int post id varchar content其中 post id 是外键引用表帖子 如
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • #1045 - 用户“root”@“localhost”的访问被拒绝(使用密码:YES)

    这可能看起来多余 但我无法找到正确的解决方案 我无法使用 mysql 控制台登录 mysql 它要求输入密码 但我不知道我实际输入的内容 有办法获取密码或更改密码吗 这就是我的 config inc 的样子 当我尝试打开 phpmyadmi
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 如何使回收器视图开始从中心添加项目?

    我有一个以 水平线性布局 作为布局管理器的 recyclerView Recycler View 采用框架布局 layout gravity center layout width wrap content 我希望回收器视图开始从中心添加项
  • 如何判断 MouseDown 事件中是否按下了 Shift?

    我正在抓一个MouseDown控件上的事件 这给了我一个MouseEventArgs签名中的对象 现在我希望能够判断用户在单击时是否按住了 Shift 或 Control 键 但是MouseEventArgs对象不包含任何键盘信息 What
  • 页面内锚链接的 jQuery this.hash 行为

    我有一个关于 this hash 如何在 jQuery 中的页面锚链接工作的问题 每次用户单击该链接时 我都需要处理哈希属性 a href foo class inpageLink Click Me lt a gt a a h3 Targe
  • System.Net.MailMessage 允许某些无效的电子邮件地址格式

    许多人可能已经意识到 正确验证电子邮件地址可能有点像一场噩梦 您可以整天搜索与当前 RFC 标准匹配的 C 正则表达式 您会发现不同的正则表达式会给出不同的结果 如果你看http en wikipedia org wiki Email ad
  • 使用无符号字符计数器从 0 到 255 进行无限循环

    我想打印 0 255 中的所有数字 但这个循环不会停止 为什么 for unsigned char i 0 i lt 255 i cout lt lt int i lt lt endl i is an unsigned char其范围通常为
  • MVC4 Razor 视图中出现奇怪的空白

    我正在 ASP Net MVC4 中开发一个应用程序 并且遇到了一个奇怪的空白问题 我用 Razor 开发了很多 MVC3 网站 没有出现这个问题 这是我的模板 cshtml 文件 content bootstrap bootstrap m
  • querySelector() 和 querySelectorAll() 之间的区别[0]

    我遇到了一些 JS 代码 使用以下代码来选择多个节点中的第一个 querySelectorAll 0 下面的代码不是在做同样的事情吗 querySelector 使用有什么好处吗querySelectorAll 0 两个表达式将返回完全相同
  • Context.startForegroundService()然后没有调用Service.startForeground()?

    我的用户报告了数百起崩溃 但我仍然找不到解决方案 这些崩溃来自 Android 8 三星 华为 谷歌 我遇到这两次崩溃 Fatal Exception android app RemoteServiceException Context s
  • 如何在html页面中嵌入React组件

    我想构建一个像这样的 React 组件 class MyComponent extends React Component render return div This is a simple component div 并像这样使用它
  • 如何找到当前焦点的程序?

    我如何知道当前焦点是哪个进程 编辑 Windows 操作系统 从 XP 到 7 Call GetForegroundWindow http msdn microsoft com en us library windows desktop m
  • Entity Framework 4.3 迁移移动现有数据

    我正在使用 EF Code First 4 3 迁移来更新我的数据库方案 现在我遇到以下情况 需要删除表A 必须创建表B 并且必须将表A的数据 以及一些其他数据 复制到表B 我无权访问DbContext in the DbMigration
  • 如何在 Spring Boot 项目的调试/运行时在 IntelliJ“out”目录中生成 build-info.properties?

    在我的 build gradle 中 我添加了 spring 构建信息 springBoot mainClass springBootMainClass buildInfo additionalProperties name appName
  • 自定义 HashMap 实现

    这个问题是在一次采访中问我的 我认为获得最佳解决方案的唯一方法是 SOF 所以问题是 如何在java中实现自定义HashMap 假设没有称为HashMap的数据结构 我能想到的唯一答案是实现关联数组 但话又说回来 Java 没有关联数组 对
  • 关闭 Eclipse / Aptana 中的工具提示

    我不知道是否有人注意到 Eclipse 有这个烦人的功能 它需要在悬停任何东西时显示无用的工具提示 我想知道是否有人知道一种方法可以完全消除 Eclipse Aptana 中的所有工具提示行为 Thanks 我在 Window gt Pre
  • 无法链接到 libgfortran.a [重复]

    这个问题在这里已经有答案了 我的系统和文件上安装了 gfortranlibgfortran a可以在以下位置找到 usr lib gcc x86 64 linux gnu 4 6 Using nm我确定该功能 gfortran compar
  • 从两个列表中删除一个元素

    我有 list a 和 list b 这两个列表都有订单中的项目 每次我在 list b 中遇到 0 时 我想从 list a AND list b 中删除与该索引关联的条目 我不知道该怎么做 Before modification lis
  • 长型64位linux

    非常简单的问题 伙计们 但也许我只是忘记了一些事情 在64位linux中 long是8字节正确吗 如果是这种情况 并且我想设置第 64 位 我可以执行以下操作 unsigned long num 1 lt lt 63 然而 每当我编译这个时
  • Eclipse ADT 捆绑包链接在哪里? [复制]

    这个问题在这里已经有答案了 在 Android 开发的官方网站上 我无法再看到 Eclipse ADT 捆绑包的链接 我无法切换到 Android Studio 因为我的框架当前是基于 Ant 的 而不是Gradle https en wi
  • 如何在 Flutter 中创建带圆角的模态底板?

    显示模态底部表不提供任何造型或装饰 我想创建类似 Google Tasks 底页的内容 更新于 2019 08 05 您现在可以使用默认值来完成此操作showModalBottomSheet现在支持添加的方法ShapeBorder并且bac
  • Jooq LocalDateTime 字段使用系统时区而不是会话时区

    我正在使用 jooq v3 11 9 访问以 UTC 时间运行的 MySQL 数据库 我使用生成的实体并使用 JSR 310 时间类型 我在配置中使用的选项