За съжаление имате няколко неща, които работят срещу вас:
- Драйверът PostgreSQL JDBC задава часовата зона на вашата JVM часова зона в сесията на Postgres. Така че дори ако вашият сървър на база данни работи в UTC, полето TIMESTAMP ще бъде вмъкнато, като се използва часовата зона на вашата JVM. Когато вмъквате или заявявате данни, сървърът на базата данни винаги ще използва JVM часовата зона.
- Използвате TIMESTAMP вместо TIMESTAMPTZ. Описанието на тези видове не отразява действителната им употреба. TIMESTAMPTZ всъщност означава агностик на часовата зона. Каквато и стойност да вмъкнете, тя ще бъде коригирана към UTC с помощта на часовата зона на сесията.
Поради тези два проблема, ако имате две различни JVM - едната използва времето в Лос Анджелис, а другата използва времето в Ню Йорк - винаги, когато пишете TIMESTAMP с една JVM, това ще бъде различно "UTC време" в другата JVM. TIMESTAMP взема коригираната стойност и просто я използва, както е дадена. Ако промените вашите колони TIMESTAMP на TIMESTAMPTZ, тогава едно и също време в двете JVM винаги ще бъде едно и също UTC време.
Ако погледнете ConnectionFactoryImpl#openConnectionImp на JDBC драйвера на Postgres, можете да видите къде задава вашата локална JVM часова зона като часова зона за зоната на сесията на сървъра на базата данни.
Така че единственият разумен начин да се справите с това е да използвате само TIMESTAMPTZ вместо TIMESTAMP. Ето малко повече информация за това:
PostgreSQL/JDBC и TIMESTAMP срещу TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html