gpt4 book ai didi

java - SQL 的 CURRENT_TIMESTAMP(在 JDBC 上使用时)是否与时区无关?

转载 作者:行者123 更新时间:2023-11-30 08:44:26 25 4
gpt4 key购买 nike

在 Apache OAK 中,我们使用 SQL 的 CURRENT_TIMESTAMP 来询问数据库当前时间的想法(不是为了存储它,而是为了验证与数据库对话的所有 Oak 实例具有大致相同的系统时间)。

该值是使用 JDBC ResultSet 和 getTimestamp().getTime() 接收的,它应该返回一个适合与 System.currentTimeMillis() 进行比较的值.

这似乎有效,直到有人尝试连接到在不同时区运行的 IBM DB2 实例,在这种情况下,返回的时间戳因 TZ 差异(或可能是 DST 偏移常量)而关闭 - 详细信息在 https://issues.apache.org/jira/browse/OAK-3645

所以问题是:

  1. 这是 DB2 或其 JDBC 驱动程序的已知问题吗?
  2. 其他数据库也会发生这种情况吗?
  3. 是否有既可靠又便携的替代方案?

最佳答案

问题是 JDBC 规范要求驱动程序解释没有时区信息的 TIME(或 TIMESTAMP),就好像该值在 JVM 的本地时区中一样。另见 Is java.sql.Timestamp timezone specific?

举个例子。您的数据库服务器使用 UTC,而 JVM 使用 CET (UTC+1)。 UTC 中的当前时间是 10:00,这意味着如果您询问当前时间,服务器上的时间是“10:00”。 TIME 数据类型没有时区,因此当 JVM 查询它时,它必须将其转换为本地时区的“10:00”。所以结果是 10:00 CET(即 9:00 UTC),换句话说:相差一小时。

根据提供的信息,听起来 DB2 驱动程序正在做它应该做的事情。

不幸的是,并不是所有的 JDBC 驱动程序都能正确地做到这一点,更糟糕的是,某些驱动程序可以配置为不同的行为。

关于java - SQL 的 CURRENT_TIMESTAMP(在 JDBC 上使用时)是否与时区无关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com