Unix Timestamp em timezone diferente do timezone da app

Bom dia! Estou com um probleminha na conversão de um unix timestamp (1300290900) para um Date.

Utilizei o seguinte site para testar o valor da data: http://www.epochconverter.com/, que retornou:

GMT: Wed, 16 Mar 2011 15:55:00 GMT
Your timezone: quarta-feira, 16 de março de 2011 12:55:00

No java, minha aplicação está usando o TimeZone “America/Sao_Paulo” e a data correta neste caso é a GMT.

Tentei da seguinte forma:

long teste = 1300290900 * 1000L;
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT"));
c.setTimeInMillis(teste);
System.out.println( c.getTime() );

Mas o meu resultado foi: Wed Mar 16 12:55:00 BRT 2011

Alguma sugestão?

Tive que pegar o offset de tempo entre GMT e o timezone que estou usando e adicionar isso no timestamp:

TimeZone.setDefault(TimeZone.getTimeZone("America/Sao_Paulo"));
TimeZone timeZ = TimeZone.getTimeZone("America/Sao_Paulo");
				
long teste = 1300290900 * 1000L;
long tempo = timeZ.getOffset( System.currentTimeMillis() );
				
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+0"));
c.setTimeInMillis(teste + (tempo * -1));
System.out.println( c.getTime() );

Você está usando o fuso de são paulo, que é o mesmo de brasília, -3 horas em relação a UTC. O resultado que obteve está correto.

Na instancia do calendário estou usando “Etc/GMT” e não “America/Sao_Paulo” e estou buscando a data deste objeto. Não deveria me retornar sem o fuso?

Não existe o conceito de fusos em objetos Date. Quando você usa getTime no calendário ele retorna o número de segundos a partir de uma data de referência. Apenas isso. O fuso representado por esse instante no tempo é determinado pela sua aplicação.

Sugiro que faça assim:

TimeZone.setDefault(“UTC”);
Calendar.getInstance().getTime();

Marcos, desta forma ele me retorna a data errada: Wed Mar 16 12:55:00 BRT 2011