Løsningen er at bruge TIMESTAMPTZ-felter til disse øjeblikke i tid. Noget som "hvornår blev brugeren oprettet" bør aldrig gemmes med et TIMESTAMP-felt, da det som standard ikke indeholder TZ-oplysninger. JDBC-driveren håndterer disse ganske vilkårligt. Overvej f.eks. følgende:
Antag, at din JVM er i America/Los_Angeles-zonen, mens din databaseserver er i UTC.
Opret derefter følgende tabel:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Hvis du udsteder fra PSQL:
INSERT INTO test(id) values(1);
Du vil få identiske værdier for "ts" og "tswz". Begge vil være den aktuelle UTC-tid. Men hvis du udfører den SAMME EKSAKTE forespørgsel fra Java ved hjælp af JDBC-driveren, vil "ts" være det aktuelle tidspunkt i Los Angeles og "tswz" vil være UTC-tiden.
Jeg ved ikke, HVORDAN driveren sender JVM-tidszonen til serveren i dette tilfælde, fordi vi er standard på feltet på serveren. De siger, at de ikke indstiller tidszonen for sessionen, men det skal de. Uanset hvad, hvis du bruger et TIMESTAMPTZ-felt, vil du få de samme øjeblikke fra enhver JVM, uanset hvilken tidszone den tilfældigvis er i.