在Apache OAK中,我们使用SQL的CURRENT_TIMESTAMP向数据库询问当前时间的概念(不是为了存储它,而是为了验证与数据库通信的所有Oak实例具有大致相同的系统时间)。 / p>
使用JDBC ResultSet和getTimestamp().getTime()
接收值,该值应返回适合与System.currentTimeMillis()
进行比较的值。
这似乎有效,直到有人试图连接到在不同时区运行的IBM DB2实例,在这种情况下,返回的时间戳由TZ差异(或可能是DST偏移常量)关闭 - 详细信息在{{ 3}}
所以问题是:
答案 0 :(得分:2)
问题是JDBC规范要求驱动程序在没有时区信息的情况下解释TIME
(或TIMESTAMP
),就好像该值在JVM的本地时区中一样。另请参阅Is java.sql.Timestamp timezone specific?
举个例子。您的数据库服务器是UTC,而CVM是CET(UTC + 1)。 UTC中的当前时间是10:00,这意味着如果您要求当前时间,那么它是" 10:00"在服务器上。 TIME
数据类型没有时区,因此当JVM查询时,它必须将其转换为平均值" 10:00"在当地时区。所以结果是10:00 CET,(也就是9:00 UTC),换句话说:相差一小时。
根据提供的信息,它听起来像DB2驱动程序正在做它应该做的事情。
不幸的是,并非所有JDBC驱动程序都能正确执行此操作,更糟糕的是,某些驱动程序可以配置为表现不同。
答案 1 :(得分:0)
在DB2中,CURRENT_TIMESTAMP
的值始终表示数据库服务器操作系统时间。您可以使用CURRENT_TIMEZONE
值将值标准化为UTC;从CURRENT_TIMESTAMP
中减去它将产生UTC时间戳:
SELECT CURRENT_TIMESTAMP - CURRENT_TIMEZONE AS timestamp_UTC FROM sysibm.sysdummy1