MySQL&Javaでタイムゾーンを正しく扱う

タイトル通り。
色々試行錯誤したけど、結論としては
更新系のクエリーの場合

  1. JavaでDateクラスのインスタンスに正しいタイムゾーンを設定
  2. それをStatement#setObjectでセットして普通に実行するだけ

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です