MySQL&Javaでタイムゾーンを正しく扱う
タイトル通り。
色々試行錯誤したけど、結論としては
更新系のクエリーの場合
- JavaでDateクラスのインスタンスに正しいタイムゾーンを設定
- それをStatement#setObjectでセットして普通に実行するだけ
基本的にデータベース内部ではエポックからのミリ秒とかで管理してるはず。
で、SELECTクエリーの場合、ResultSet#getDateとかgetTimestampで返ってくるオブジェクトはローカルのタイムゾーンになってるので、必要に応じて適切なタイムゾーンを設定する。
基本的な事として、Dateオブジェクトに違うタイムゾーンを設定しても、内部的な時間が変更になるわけではない、はず。東京の午後1時とシンガポールの正午は内部的には同じ時間。文字列として表示した時に13:00となるか12:00となるかの違い。
慣れてしまえば、それ程難しくはないと思うけど、結構面倒。
MySQLのタイムゾーンの扱いについてはこのページが詳しい(この文書の和訳)。
JDBCドライバのオプションでタイムゾーン関係のがいくつかあるけど、試してない(マニュアルページ)。