De oplossing is om TIMESTAMPTZ-velden voor deze momenten in de tijd te gebruiken. Iets als "wanneer is de gebruiker gemaakt" mag nooit worden opgeslagen met een TIMESTAMP-veld, omdat het standaard geen TZ-informatie bevat. De JDBC-driver behandelt deze vrij willekeurig. Denk bijvoorbeeld aan het volgende:
Stel dat uw JVM zich in de zone America/Los_Angeles bevindt terwijl uw databaseserver zich in UTC bevindt.
Maak vervolgens de volgende tabel:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Als u uit PSQL verzendt:
INSERT INTO test(id) values(1);
U krijgt identieke waarden voor "ts" en "tswz". Beide zijn de huidige UTC-tijd. Als u echter DEZELFDE EXACTE query uitvoert vanuit Java met behulp van het JDBC-stuurprogramma, is "ts" de huidige tijd in Los Angeles en "tswz" de UTC-tijd.
Ik weet niet HOE het stuurprogramma in dit geval de JVM-tijdzone naar de server verzendt, omdat we het veld op de server in gebreke blijven. Ze zeggen dat ze de tijdzone voor de sessie niet instellen, maar dat moet wel. Hoe dan ook, als je een TIMESTAMPTZ-veld gebruikt, krijg je dezelfde momenten van elke JVM, ongeacht in welke tijdzone het zich bevindt.