私の知る限り、Java Date 型は Timezone から独立しています。つまり、特定の瞬間を long 型の値として表します。ここで本当に奇妙なものを見つけました。
これは、挿入しようとした元の値です。
(http-0.0.0.0-9080-4) 1352955600000 <-- 長整数。
(http-0.0.0.0-9080-4) Thu Nov 15 00:00:00 EST 2012 <-- ユーザーフレンドリーな形式。
Oracle 11g データベースへの挿入が完了したら、値が変更されました。
(http-0.0.0.0-9080-4) 1352952000000
(http-0.0.0.0-9080-4) 水曜日 11 月 14 日 23:00:00 EST 2012
これはどうして起こるのでしょうか?? さらに奇妙なのは、Jboss などの特定の環境でのみ発生することです。私は現在、以下の環境を使用しています。
- ジャバ1.6
- アイバティス 2.34
- jboss-5.1 (サーバー)
- tomcat 6.0 (ローカル)
- オラクル11g
役に立つ手がかりやリンクを教えてくれる人はいますか? それは本当に私を悩ませます!!
ここにさらに情報を追加します。Java では Date タイプを使用し、Oracle では TIMESTAMP WITH TIMEZONE を使用しています。
Date に値 ("11/15/2012", MM/dd/yyyy, US/Eastern) を格納しました。
そして、iBatisを使用してこの値をOracleに送信しました。そして、次のように表示されます
12/11/15 00:00:00.000000000 -04:00
これは正しくありません。DST が 11 月に終了するため、タイム ゾーンは -05:00 である必要があります。
さらに、Javaコードからこの値を取得すると、
Wed Nov 14 23:00:00 EST 2012を返しますが 、これはThu Nov 15 00:00:00 EST 2012と予想されます。
問題が解決しました。
ありがとうございます。理由がわかりました。ojdbc ドライバーの既知のバグです。このリンクを参照してください。