Opa pessoal,
Bem, sou novo aqui e queria começar contribuindo com a resolução de um problema que me consumiu boa parte da semana.
Estava fazendo um programa que mostrava a Date do sistema, usando também um SimpleDateFormat.
//formatador para imprimir no formato (ex: 14:55:15)
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//setando o fuso horário para o de São Paulo
TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
//setando esse fuso como padrão
TimeZone.setDefault(tz);
// um novo calendario Gregoriano e pegando a instancia dele com o fudo que eu também coloquei como padrão...
// acho que ficou meio que redundante mas enfim...
Calendar ca = GregorianCalendar.getInstance(tz);
// criando uma nova data com a instancia do Calendar
Date date = ca.getTime();
// passando para o meu JTextField a data formatada
campoResultadoFH.setText(sdf.format(ca.getTime()));
o que estava acontecendo.
Teste esse código em vários computadores, no meu dava 2 horas e 30 minutos atrasado,
fiquei de cara com os 30 minutos. Em outro dava 5 horas adiantado e em outros mostrava
o horário certo.
Depois de muitos testes descobri que até o “Date date = ca.getTime();” estava com
a hora certa, a hora era modificada quando passava pelo “sdf.format()”… quer
dizer, o formatador não estava pegando o TimeZone.
Dai me falaram para usar o “sdf.setTimeZone(tz);” resolvendo o problema.
o código final ficou :
//formatador para imprimir no formato (ex: 14:55:15)
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//setando o fuso horário para o de São Paulo
TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
//setando esse fuso como padrão
TimeZone.setDefault(tz);
// um novo calendario Gregoriano e pegando a instancia dele com o fudo que eu também coloquei como padrão...
// acho que ficou meio que redundante mas enfim...
Calendar ca = GregorianCalendar.getInstance(tz);
// criando uma nova data com a instancia do Calendar
Date date = ca.getTime();
// ----------- novo código ---------- setando o TimeZone no SimpleDateFormat.
sdf.setTimeZone(tz);
// passando para o meu JTextField a data formatada
campoResultadoFH.setText(sdf.format(ca.getTime()));
Dai é isso. Espero ser de alguma ajuda se alguém algum dia enfrentar
esse problema.
Abraço