解決策は、これらの瞬間にTIMESTAMPTZフィールドを使用することです。 「ユーザーが作成されたのはいつか」のようなものは、デフォルトではTZ情報を保持しないため、TIMESTAMPフィールドとともに保存しないでください。 JDBCドライバーは、これらを非常に任意に処理します。たとえば、次のことを考慮してください。
データベースサーバーがUTCである間、JVMがAmerica/Los_Angelesゾーンにあると想定します。
次に、次のテーブルを作成します。
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
PSQLから発行する場合:
INSERT INTO test(id) values(1);
「ts」と「tswz」の値は同じになります。両方とも現在のUTC時間になります。ただし、JDBCドライバーを使用してJavaから同じ正確なクエリを実行する場合、「ts」はロサンゼルスの現在の時刻になり、「tswz」はUTCの時刻になります。
この場合、サーバーのフィールドがデフォルトになっているため、ドライバーがサーバーにJVMタイムゾーンをどのように伝達するかはわかりません。彼らは、セッションのタイムゾーンを設定しないと言いますが、設定する必要があります。いずれにせよ、TIMESTAMPTZフィールドを使用すると、どのタイムゾーンにあるかに関係なく、どのJVMからも同じインスタントを取得できます。