残念ながら、あなたにはいくつかの問題があります:
- PostgreSQL JDBCドライバーは、PostgresセッションでタイムゾーンをJVMタイムゾーンに設定します。したがって、データベースサーバーがUTCで実行されている場合でも、JVMのタイムゾーンを使用してTIMESTAMPフィールドが挿入されます。データを挿入またはクエリすると、データベースサーバーは常にJVMタイムゾーンを使用します。
- TIMESTAMPTZの代わりにTIMESTAMPを使用しています。これらのタイプの説明は、実際の使用法を反映していません。 TIMESTAMPTZは、実際にはタイムゾーンにとらわれないことを意味します。挿入する値が何であれ、セッションのタイムゾーンを使用してUTCに調整されます。
これらの2つの問題のため、2つの異なるJVM(1つはロサンゼルス時間を使用し、もう1つはニューヨーク時間を使用)がある場合、一方のJVMでTIMESTAMPを作成すると、もう一方のJVMでは異なる「UTC時間」になります。 TIMESTAMPは調整された値を取得し、指定されたとおりに使用します。 TIMESTAMP列をTIMESTAMPTZに変更すると、両方のJVMの同じ時刻が常に同じUTC時刻になります。
Postgres JDBC DriverのConnectionFactoryImpl#openConnectionImpを見ると、ローカルJVMのタイムゾーンがデータベースサーバーのセッションゾーンのタイムゾーンとして設定されている場所がわかります。
したがって、これに対処する唯一の正しい方法は、TIMESTAMPの代わりにTIMESTAMPTZのみを使用することです。これに関する詳細は次のとおりです:
PostgreSQL/JDBCおよびTIMESTAMPとTIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html