Data de análise com fusos horários diferentes

Mesmo com cerca de 15 anos em Java sempre se depara com o tópico de lidar com datas e horas ...

Aqui está a situação: recebo um timestamp de algum sistema externo como umString representação. A semântica do registro de data e hora é que ela representa uma data UTC. Este registro de data e hora deve ser colocado em uma entidade e, em seguida, em um banco de dados PostgreSQL em umTIMESTAMP campo. Além disso, eu preciso colocar o mesmo timestamp como hora local (no meu caso CEST) na entidade e, em seguida, no banco de dados em umTIMESTAMP WITH TIME ZONE campo.

Qual é o caminho certo para garantir que não importa quais são as configurações da máquina executando o código, os carimbos de data / hora são armazenados corretamente na entidade (para fazer algumas validações com outros timestamps UTC) e no banco de dados (para usá-los em relatórios posteriores) em)?

Aqui está o código, que funcionou bem na minha máquina local:

<code>SimpleDateFormat sdfUTC = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
sdfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcTimestamp = sdfUTC.parse(utcTimestampString);
// getMachinesTimezone is some internal util method giving the TimeZone object of the machines Location
Calendar localTimestamp = new GregorianCalendar(getMachinesTimezone());
localTimestamp.setTimeInMillis(utcTimestamp.getTime());
</code>

Mas ao executar o mesmo código no servidor, isso resultou em tempos diferentes, então presumo que não seja a maneira correta de lidar com isso. Alguma sugestão?

PS: Eu li sobre o Joda Time ao procurar neste fórum, mas no projeto em questão eu não sou capaz de introduzir novas bibliotecas, já que eu só mudo um módulo existente, então eu tenho que viver com o padrão JDK1.6

questionAnswers(3)

yourAnswerToTheQuestion