Quando você armazena um
timestamp with time zone
(timestamptz
) é convertido em UTC para armazenamento no banco de dados. Quando recuperado, ele é convertido para o fuso horário atual do cliente, não para o fuso horário em que estava originalmente. É um ponto no tempo, basicamente. Há também
timestamp without time zone
(timestamp
). Isso não está sujeito a conversão, mas não levar um carimbo de data/hora com ele. Se você armazenar um timestamp
com o fuso horário do cliente definido como UTC, recupere-o quando o fuso horário do cliente for '+08:00', você obtém o mesmo valor. Isso é metade do que você deseja, pois preserva o valor bruto do tempo. Os nomes e comportamentos são horríveis e confusos, mas definidos pelo padrão SQL.
Você deve armazenar o fuso horário separadamente se desejar gravar um ponto no tempo em um fuso horário específico. Eu recomendo armazená-lo como um
INTERVAL
com um CHECK
restrição limitando-o a ser colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Essa definição rejeita -12:00 e aceita +12:00; Eu não estou totalmente certo de que está certo, então verifique. Você pode armazenar o
timestamp
da hora local nesse fuso horário (o que eu provavelmente faria) ou armazenar o timestamptz
da hora UTC em que o evento ocorreu mais um deslocamento que permite convertê-lo para a hora local. Qualquer um funcionará bem para JDBC. Para JPA, dependerá de quão bem seu provedor entende e mapeia os tipos de intervalo. Idealmente, você deseja um campo gerado transitório em sua entidade que reconstrói a instância do Calendar desejada usando o
timestamp
e interval
armazenados no banco de dados.