ちょっとこの記事、
自信のないまま書くのですが…
(まあ、他も大して変わりませんが)
java.util.Dateクラスで保持されている値って、
タイムゾーン情報無いんですよね?
というか、あえて言うならGMTなんですよね?
「あえて言うなら」という表現もユーザに選択権があるように感じるので、
GMTとして処理す「べき」ぐらい?
Dateクラスをインスタンス化して、
toString()とgetTime()を出力するプログラムを、
実行マシンのタイムゾーンJSTとGMTで切替えて実行したところ、
Wed Jan 11 16:59:33 JST 2006
1136966373468
Wed Jan 11 07:59:51 GMT 2006
1136966391281
17813ミリ秒の差(+0900と考えると32400秒)
となりますし、java.sql.DateのJavadocには、
ミリ秒の値は、1970 年 1 月 1 日グリニッジ標準時 00:00:00.000 からの経過時間をミリ秒で表した数値です。
とある。
java.util.Dateクラスの説明ではないので確信は持てないですが、
ソース見ても明らかな変換処理は見受けられませんでした。
なぜこんなこと言っているかと言うと、
本番環境とテスト環境で表示結果が異なっていて、
それぞれのサーバのタイムゾーンがGMTとJSTで異なるためなんです。
もっと言うと、Oracleから
SELECT TO_CHAR(SYSDATE, "...") FROM DUAL;
のように「文字列」で持ってきて、
何かゴニョゴニョしているようです。
Date convert(Date)
みたいな処理もあります。(引数と戻り値でlong値が異なっている)
これ、TO_CHARやめて、ResultSetからgetDate()で引っ張ってきた場合、
SYSDATEでタイムゾーン情報は欠落しているが、
OracleサーバがGMTだろうがJSTだろうが「適切に変換されて」、
受け側では等価のDateオブジェクトが得られるのでは?
TO_CHAR使うならば、タイムゾーン情報を含むSYSTIMESTAMP関数を用いてやり取りし、
アプリケーション側で「適切に」Dateオブジェクトに変換する。
前の仮定が本当なら、これは面倒なのでやりたくないですね。
なーんか、タイムゾーン「決め打ちで」、
妙にタイムゾーンを意識した処理を実装したため、
特定の環境でしか正常に動作しない状況になっているように、
思えてなりません…
最近のコメント