首页 > 解决方案 > 处理时区时 JDBC 的行为不一致

问题描述

我有两个服务。以下是对这两种服务都适用的一些信息。语言:Java ORM:mybatis - 他们使用这个框架与数据库交互。DB:甲骨文。

目标:Insert time in 'created_date' column in DB in UTC timezone

在这两种服务中,Timezone.setDefault(Timezone.get("UTC"))都设置了。除了这条线,我们在服务中没有设置时区。此行设置 JVM 默认时区。然后,我们尝试使用mybatis.save(record). Created_date 具有 java.util.Date 作为两者中的类型。数据库中的列对两者都有 TIMESTAMP WITH TIMEZONE。在服务 1 中,它可以工作。如果发送的时间是 UTC 下午 3 点,则数据库中的 created_date 列显示 UTC 下午 3 点。但是,在服务 2 中,同时是亚洲/加尔各答下午 3 点。注意时区的变化。数字部分是正确的。

对于两个数据库,DBtimezone = America/Montreal, sessiontimeZone = Asia/Calcutta.

我知道在处理时区时使用 java.util.Date 很讨厌,我们必须使用java.time-classes 但我很想知道这种不一致行为的原因。

并且服务 3 中的行为(另一个服务,其 dbtimezone 为 UTC,sessiontimezone 为 Asia/Calcutta)进一步混淆了水。在服务 3 中 - 我正在尝试插入澳大利亚/珀斯(AWST)下午 3 点,但在数据库中,它是下午 3 点(UTC)。它应该花费我(UTC)或用户(会话时区,即亚洲/加尔各答)给出的时间,但它在这里花费了 UTC。UTC 既不是 JVM 时区,也不是用户或会话时区。

看起来像 Hibernate 和 Mybatis 这样的框架委托给 JDBC 来确定时区。

这导致我们 - 声明:“如果我们不强制框架或 JDBC 采用时区,它将始终采用 JVM 时区作为默认时区。”

  1. 这种说法总是正确的吗?
  2. 如果您对上述问题的回答属实,则服务 3 似乎与此相矛盾。你怎么解释?
  3. 它是否取决于 JDBC 驱动程序的实现来确定时区,这意味着 JVM 时区可能并不总是占主导地位?

注:第 1 题和第 3 题为是/否题。如果您以“是/否”开始回答,然后跳入细节,那就太好了。

标签: javajdbctimezonemybatisutc

解决方案


推荐阅读