Infelizmente, você tem algumas coisas trabalhando contra você:
- O driver JDBC do PostgreSQL define o fuso horário para o fuso horário da JVM na sessão do Postgres. Portanto, mesmo que seu servidor de banco de dados esteja executando em UTC, um campo TIMESTAMP será inserido usando o fuso horário de sua JVM. Quando você insere ou consulta dados, o servidor de banco de dados sempre usará o fuso horário da JVM.
- Você está usando TIMESTAMP em vez de TIMESTAMPTZ. A descrição desses tipos não reflete seu uso real. TIMESTAMPTZ na verdade significa agnóstico de fuso horário. Qualquer valor que você inserir será ajustado para UTC usando o fuso horário da sessão.
Devido a esses dois problemas, se você tiver duas JVMs diferentes - uma usando o horário de Los Angeles e a outra usando o horário de Nova York - sempre que você escrever um TIMESTAMP com uma JVM, será um "horário UTC" diferente na outra JVM. TIMESTAMP pega o valor ajustado e apenas o usa como dado. Se você alterar suas colunas TIMESTAMP para TIMESTAMPTZ, a mesma hora em ambas as JVMs será sempre a mesma hora UTC.
Se você observar o ConnectionFactoryImpl#openConnectionImp do driver JDBC do Postgres, poderá ver onde ele define o fuso horário da JVM local como o fuso horário para a zona de sessão do servidor de banco de dados.
Portanto, a única maneira sensata de lidar com isso é usar apenas TIMESTAMPTZ em vez de TIMESTAMP. Aqui estão mais algumas informações sobre isso:
PostgreSQL/JDBC e TIMESTAMP vs. TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html