この問題は非常に広く見られます。たとえば、Martin Fowlerの発言があります。
根本的な問題は、Javaの日付クラスが物理的な量のような日付/時刻を扱うことです。具体的で不変な瞬間の表現です。
これは、ほとんどの人が気にして時間について考える方法とは一致しないという問題があります。典型的な談話では、人々は固定観念として '2009-08-01 18:00'を考える。問題は、そのような表現に付けられたタイムゾーンがないことです。したがって、実際には特定の瞬間を表すわけではありません。
これは多くのアプリケーションで引き続き混乱する原因です。 Javaでは常に暗黙的または明示的にタイムゾーンを使用しますが、データベースは通常、日付/時刻とともにタイムゾーン情報を格納しません。したがって、Javaは、Dateオブジェクトを作成するときに想定されるタイムゾーンを追加する必要があります。これは、値をDateオブジェクトに変換するときにJDBCドライバによって行われます。このようなコードがサーバー上で実行される場合、想定されるタイムゾーンは、クライアント/エンドユーザーによって使用されるタイムゾーンとしばしば一致しません。
唯一の答えは、Javaコードが「標準」タイムゾーンを使用していることを確認することです。