「ヨーロッパ/ロンドン」タイムゾーンにデータベースサーバーがあり、「ヨーロッパ/ブリュッセル」にWebサーバーがあります。今は夏時間なので、私のアプリケーションサーバーには2時間の違いがあります。
問題を再現するためのテストを作成しました。
Query q = JPA.em().createNativeQuery("SELECT UNIX_TIMESTAMP(startDateTime) FROM `Event` WHERE `id` =574");
BigInteger unix = (BigInteger) q.getSingleResult();
System.out.println(unix + "000 UNIX_TIMESTAMP to BigInteger");
Query q2 = JPA.em().createNativeQuery("SELECT startDateTime FROM `Event` WHERE `id` =574");
Timestamp o = (Timestamp) q2.getSingleResult();
System.out.println(o.getTime() + " Timestamp");
startDateTime列は「datetime」として定義されています(ただし、「timestamp」と同じ問題です)。取得する出力は次のとおりです。
1340291591000 UNIX_TIMESTAMP to BigInteger
1340284391000 Timestamp
Javaの日付オブジェクトを読み取るとタイムゾーンがシフトします。これを修正するにはどうすればよいですか?jdbcドライバーは、サーバーから取得する「unixtime」値をDateオブジェクトに設定するだけでよいと思います。
(適切なソリューションは、GMTのdbだけでなく、任意のタイムゾーンの組み合わせで機能するはずです)