java - 处理时区时 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 时区作为默认时区。”
- 这种说法总是正确的吗?
- 如果您对上述问题的回答属实,则服务 3 似乎与此相矛盾。你怎么解释?
- 它是否取决于 JDBC 驱动程序的实现来确定时区,这意味着 JVM 时区可能并不总是占主导地位?
注:第 1 题和第 3 题为是/否题。如果您以“是/否”开始回答,然后跳入细节,那就太好了。
解决方案
推荐阅读
- jenkins - 无法读取詹金斯管道作业中的 gradle.properties
- python - 在后台执行 python 脚本,同时返回对话流响应(Python Flask)
- angular - Angular 不会在异步任务中显示任何类型的 Observable userdata
- react-native - 使用操作按钮时出现 Usenativedriver 错误 - 动画问题
- pandas - 大熊猫 df.describe() 上的 TQDM
- javascript - 如何使用正则表达式或字符串函数在字符串中插入反斜杠以在 JavaScript 中的 \ 之后提取子字符串?
- c - 编译器优化不尊重`-pthreads`
- python - 使用请求模块 Python 登录 Instagram 时遇到问题
- angular - 安装角度编译器的问题
- python - 烧瓶:sqlalchemy.exc.ProgrammingError:(psycopg2.errors.UndefinedColumn)列