Bohužel máte několik věcí, které pracují proti vám:
- Ovladač PostgreSQL JDBC nastavuje časové pásmo na časové pásmo vašeho JVM v relaci Postgres. Takže i když váš databázový server běží v UTC, pole TIMESTAMP bude vloženo pomocí časového pásma vašeho JVM. Když vkládáte nebo dotazujete data, databázový server vždy použije časové pásmo JVM.
- Používáte TIMESTAMP místo TIMESTAMPTZ. Popis těchto typů neodráží jejich skutečné použití. TIMESTAMPTZ ve skutečnosti znamená časové pásmo agnostik. Jakákoli hodnota, kterou vložíte, bude upravena na UTC pomocí časového pásma relace.
Kvůli těmto dvěma problémům, pokud máte dvě různá JVM – jedno používá čas Los Angeles a druhé čas New York – kdykoli napíšete TIMESTAMP s jedním JVM, bude to jiný „čas UTC“ ve druhém JVM. TIMESTAMP převezme upravenou hodnotu a použije ji tak, jak je daná. Pokud změníte sloupce TIMESTAMP na TIMESTAMPTZ, bude stejný čas v obou JVM vždy stejný čas UTC.
Pokud se podíváte na ConnectionFactoryImpl#openConnectionImp ovladače Postgres JDBC, můžete vidět, kde nastavuje časové pásmo vašeho místního JVM jako časové pásmo pro zónu relace databázového serveru.
Takže jediný rozumný způsob, jak se s tím vypořádat, je vždy používat pouze TIMESTAMPTZ místo TIMESTAMP. Zde je několik dalších informací:
PostgreSQL/JDBC a TIMESTAMP vs. TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html