2

JVM タイムゾーンの詳細:インド標準時アジア/カルカッタ019800000

DB タイムゾーンの詳細 :中央標準時アメリカ/シカゴ 3600000-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 を使用してテストしたところ、期待どおりに動作し、db 時間を出力しました

出力:

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 を使用してテストしました。

出力:

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 の問題点を教えてください。私のアプリケーションは、DB タイムスタンプと一致する getTimestamp() の Test-1 のような db 時間を期待しています。

4

1 に答える 1

1

数日前、私の会社で同じ問題が発生しました。これの要点は、タイムスタンプを文字列として取得してはならず (データベース/ドライバー固有であるため)、常に TimeStamp オブジェクトを取得し、SimpleDateFormat.

そして、Timestamp クラスは abomination であることに常に言及する価値があります。javadocs から

上記の Timestamp クラスと java.util.Date クラスの違いにより、コードは Timestamp 値を一般的に java.util.Date のインスタンスとして表示しないことをお勧めします。Timestamp と java.util.Date の間の継承関係は、型の継承ではなく、実際には実装の継承を示しています。

于 2013-12-05T11:26:48.960 に答える