Rozwiązaniem jest użycie pól TIMESTAMPTZ dla tych chwil w czasie. Coś w rodzaju "kiedy utworzono użytkownika" nigdy nie powinno być przechowywane z polem TIMESTAMP, ponieważ domyślnie nie przechowuje informacji TZ. Sterownik JDBC obsługuje je całkiem arbitralnie. Weźmy na przykład pod uwagę następujące kwestie:
Załóżmy, że Twoja maszyna JVM znajduje się w strefie America/Los_Angeles, podczas gdy serwer bazy danych jest w czasie UTC.
Następnie utwórz następującą tabelę:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Jeśli wydajesz z PSQL:
INSERT INTO test(id) values(1);
Otrzymasz identyczne wartości dla „ts” i „tswz”. Oba będą aktualnym czasem UTC. Jeśli jednak wykonasz zapytanie SAME EXACT z Javy za pomocą sterownika JDBC, „ts” będzie bieżącym czasem w Los Angeles, a „tswz” będzie czasem UTC.
Nie wiem, JAK sterownik przekazuje serwerowi strefę czasową JVM w tym przypadku, ponieważ domyślnie ustawiamy pole na serwerze. Mówią, że nie ustawiają strefy czasowej na sesję, ale muszą. Tak czy inaczej, jeśli użyjesz pola TIMESTAMPTZ, otrzymasz te same chwile z dowolnej JVM, niezależnie od strefy czasowej, w której się znajduje.