2

JVM 时区详细信息:印度标准 TimeAsia/Calcutta019800000

DB 时区详细信息: Central Standard TimeAmerica/Chicago3600000-21600000

示例代码:

String sql = "select systimestamp as base from dual";
....
PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
    System.out.println(rs.getTimestamp("base"));
    System.out.println(rs.getString("base"));
}

测试 1:我使用 ojdbc14.jar 10.1.0.3.0 进行了测试,它按预期工作,打印数据库时间

输出:

2013-12-05 01:23:57.141583 
2013-12-5 1.23.57.141583000 -6:0 

测试 2:我使用 ojdbc5.jar 和 ojdbc6.jar 11.2.0.3.0 进行了测试,getTimestamp 打印本地时间,而 getString 打印数据库时间。

输出:

2013-12-05 12:57:54.3508 
2013-12-05 01:27:54.3508 -6:00 

请建议使用 getTimestamp() 打印本地时间的 Test-2 ojdbc 驱动程序版本 11.2.0.3.0 有什么问题。我的应用程序期望在 getTimestamp() 中像 Test-1 这样的数据库时间与数据库时间戳匹配。

4

1 回答 1

1

几天前我们在我的公司遇到了同样的问题。最重要的是,您永远不应该将时间戳记作为字符串(因为它是特定于数据库/驱动程序的),并且始终获取 TimeStamp 对象并使用SimpleDateFormat.

总是值得一提的是 Timestamp 类是一个可憎的,来自javadocs

由于上面提到的 Timestamp 类和 java.util.Date 类之间的差异,建议代码不要将 Timestamp 值一般视为 java.util.Date 的实例。Timestamp 和 java.util.Date 的继承关系实际上是实现继承,而不是类型继承。

于 2013-12-05T11:26:48.960 回答