Niestety kilka rzeczy działa przeciwko tobie:
- Sterownik PostgreSQL JDBC ustawia strefę czasową na strefę czasową JVM w sesji Postgres. Tak więc nawet jeśli serwer bazy danych działa w czasie UTC, pole TIMESTAMP zostanie wstawione przy użyciu strefy czasowej JVM. Kiedy wstawiasz lub wysyłasz zapytanie o dane, serwer bazy danych zawsze będzie używał strefy czasowej JVM.
- Używasz TIMESTAMP zamiast TIMESTAMPTZ. Opis tych typów nie odzwierciedla ich faktycznego zastosowania. TIMESTAMPTZ w rzeczywistości oznacza agnostykę strefy czasowej. Każda wstawiona wartość zostanie dostosowana do czasu UTC przy użyciu strefy czasowej sesji.
Z powodu tych dwóch problemów, jeśli masz dwie różne maszyny JVM — jedna korzystająca z czasu Los Angeles, a druga z czasu nowojorskiego — za każdym razem, gdy napiszesz TIMESTAMP z jedną JVM, będzie to inny „czas UTC” w drugiej JVM. TIMESTAMP przyjmuje dostosowaną wartość i po prostu używa jej zgodnie z podaną. Jeśli zmienisz kolumny TIMESTAMP na TIMESTAMPTZ, ten sam czas w obu maszynach JVM będzie zawsze tym samym czasem UTC.
Jeśli spojrzysz na ConnectionFactoryImpl#openConnectionImp sterownika Postgres JDBC, zobaczysz, gdzie ustawia on strefę czasową lokalnej maszyny JVM jako strefę czasową dla strefy sesji serwera bazy danych.
Więc jedynym rozsądnym sposobem radzenia sobie z tym jest używanie tylko TIMESTAMPTZ zamiast TIMESTAMP. Oto więcej informacji na ten temat:
PostgreSQL/JDBC i TIMESTAMP vs. TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html