SimpleDateFormat.format retorna a hora anterior

O método a seguir está retornando a hora como texto com um decremento de 1, em relação a hora configurado no objeto Date passado como parâmetro. Por exemplo, se a hora em date é 6, na string vira 5, se é 12 vira 11.

	    public static String toString(Date date, String s, TimeZone timezone)
	    {
	        if(date == null)
	        {
	            return GenericFormatter.fillRight("", ' ', s.length());
	        } else
	        {
	            SimpleDateFormat simpledateformat = new SimpleDateFormat(s);
	            simpledateformat.setTimeZone(timezone);
	            return simpledateformat.format(date);
	        }
	    }

Não entendi porque isso ocorre, mesmo após ver o fonte do método format.

Estou usando:

private static int timeZone = -3; // GMT -3
private static SimpleTimeZone brazilianTimeZone = new SimpleTimeZone(timeZone * 60 * 60 * 1000, "BRA");

E a string do formato de hora é “HH:mm:ss”

:cry:

http://www.arquivodecodigos.net/sistema/main/visualizar_dica/2432

O problema não é com a Classe Date, mas com o parsing de SimpleDateTime para gerar o Date.

Agora percebi que eu inverti a situação no texto, na verdade a hora retornada é o incremento de 1 da original.

Assim, a string de hora 05:59:24 se transforma no objeto Date 06:59:24. E se eu usar 00:15:45 vou ter 01:15:45.

Isso não faz sentido, porque já estou determinando o valor da hora. Não é como o argumento do mês que é de 0 a 11.

Senão vou ter que passar -01:30:21 pra ter 00:28:12.

Esse é o problema.

Que timezone é esse (“BRA”)?

Os timezones para o Brasil são:

“Brazil/Acre”
“Brazil/DeNoronha”
“Brazil/East”
“Brazil/West”

O criador do código havia colocado BET.

Fui pesquisar BET neste endereço:

http://www.worldtimezone.com/wtz-names/

E vi que era Bering Standard Time (UTC-11)

Procurei no mesmo local timezone para o Brasil e encontrei BRA.

Fiz a alteração para “Brazil/East” e rodei novamente o teste, mas continua do mesmo jeito.

Ah, obrigado pela lista de timezones.

Se você está em um lugar onde o horário de verão está em vigor (São Paulo, RJ, BSB etc.), então o timezone corrente não é GMT-3 e sim “Brazil/East”. Mas deve haver mais algum problema em algum ajuste no seu sistema.

Ah, e seu código sempre está criando um timezone, em vez de usar um que já existe. Você deveria usar algo como:

TimeZone brazilianTimeZone = TimeZone.getTimeZone ("Brazil/East");