Lösningen är att använda TIMESTAMPTZ-fält för dessa ögonblick i tid. Något som "när skapades användaren" bör aldrig lagras med ett TIMESTAMP-fält eftersom det som standard inte innehåller TZ-information. JDBC-drivrutinen hanterar dessa ganska godtyckligt. Tänk till exempel på följande:
Anta att din JVM är i America/Los_Angeles-zonen medan din databasserver är i UTC.
Skapa sedan följande tabell:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Om du utfärdar från PSQL:
INSERT INTO test(id) values(1);
Du kommer att få identiska värden för "ts" och "tswz". Båda kommer att vara aktuell UTC-tid. Men om du utför SAMMA EXAKT fråga från Java med JDBC-drivrutinen kommer "ts" att vara den aktuella tiden i Los Angeles och "tswz" kommer att vara UTC-tiden.
Jag vet inte HUR drivrutinen förmedlar JVM-tidszonen till servern i det här fallet eftersom vi förinställer fältet på servern. De säger att de inte ställer in tidszonen för sessionen, men de måste. Hur som helst, om du använder ett TIMESTAMPTZ-fält kommer du att få samma ögonblick från alla JVM oavsett vilken tidszon den råkar vara i.