Řešením je použití polí TIMESTAMPTZ pro tyto okamžiky v čase. Něco jako „kdy byl uživatel vytvořen“ by nikdy nemělo být uloženo s polem TIMESTAMP, protože ve výchozím nastavení neobsahuje informace o TZ. Ovladač JDBC je zpracovává zcela libovolně. Zvažte například následující:
Předpokládejme, že váš JVM je v zóně America/Los_Angeles, zatímco váš databázový server je v UTC.
Poté vytvořte následující tabulku:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Pokud vydáváte z PSQL:
INSERT INTO test(id) values(1);
Získáte stejné hodnoty pro „ts“ a „tswz“. Oba budou aktuálním časem UTC. Pokud však provedete STEJNĚ PŘESNÝ dotaz z Javy pomocí ovladače JDBC, pak „ts“ bude aktuální čas v Los Angeles a „tswz“ bude čas UTC.
Nevím, JAK ovladač v tomto případě předává serveru časové pásmo JVM, protože pole na serveru nastavujeme jako výchozí. Časové pásmo relace prý nenastavují, ale musí. Ať tak či onak, pokud použijete pole TIMESTAMPTZ, získáte stejné okamžiky z jakéhokoli JVM bez ohledu na to, v jakém časovém pásmu se nachází.