[RESOLVIDO] AJUDA EU: Problemas com horário de verão (dnovo)

Olá pessoal,

sei que essa é uma duvida bem comum nessa época do ano, mas eu vi algumas soluções, e até agora, nenhuma funcionou para mim.

1º: Qual é a melhor forma (a mais correta e segura) de se obter a data/hora atual em JAVA? (já considerando TimeZone e tudo mais)
2º: Qual é a melhor forma (a mais correta e segura) de se converter essa data/hora obtida em “dd/MM/yyyy” e “HH:mm”?

Pergunto isso pq agora estou estou usando, para obter a hora:

Date dataHora = new Date( System.currentTimeMillis() );

E para converter:

DateFormatter formatter = new SimpleDateFormatter( "dd/MM/yyyy" );
String dataStr = formatter.format( dataHora );

formatter = new SimpleDateFormatter( "HH:mm" );
String horaStr = formatter.format( dataHora );

Dessa forma, se nas configurações de horário do meu computador estiver marcada a opção:
“Ajustar automaticamente o relógio para o horário de verão”, o que eu obtenho da data formatada é sempre 1 hora a menos em relação a que eu deveria obter.

E me parece que o problema é na hora de formatar, ja que o resultado do currentTimeMillis nao muda conforma a opção marcada, e nem o valor a variavel dataHora. (tenho q confirmar isso, mas eu acho q é isso sim).

AJUDA…

Testei aqui e funciona blz:

public static void main(String[] args) {
		Date d1 = new Date();
		System.out.println(d1);
		
		SimpleDateFormat format = new SimpleDateFormat( "dd/MM/yyyy" );  
		String dataStr = format.format( d1 );  
		System.out.println(dataStr);
		
		format = new SimpleDateFormat( "HH:mm" );  
		String horaStr = format.format( d1 ); 
		System.out.println(horaStr);
	}

Mesmo com a opção “Ajustar automaticamente o relógio para o horário de verão” habilitada, a hora exibida é a mesma do computador.

Muito estranho isso…

Aki em casa, fica sem 1 hora a menos.

Vou tentar dnovo… q m…

Bom, eu acho q pode ser até problema aki da minha maquina, seila, so sei que nao ta dando certo, olhem so:

Esse é o código que eu rodo às 23:04 do dia 27/10/2008, com a opção “Ajustar automaticamente o relógio para o horário de verão” marcada:
Com a opção marcada, a hora do meu pc é 23:04.

package testecontabilizacaotempogasto;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.joda.time.MutableDateTime;

/**
 *
 * @author Jose Renato
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MutableDateTime periodo = new MutableDateTime( System.currentTimeMillis() );
        System.out.println( periodo );
               
        Date d1 = new Date();  
        System.out.println(d1);  

        SimpleDateFormat format = new SimpleDateFormat( "dd/MM/yyyy" );    
        String dataStr = format.format( d1 );    
        System.out.println(dataStr);  

        format = new SimpleDateFormat( "HH:mm" );    
        String horaStr = format.format( d1 );   
        System.out.println(horaStr);  
    }

Essa é a saida:

2008-10-27T23:04:16.000-02:00 (essa é a saida do MutableDateTime)
Mon Oct 27 22:04:16 BRT 2008 (essa é a saida do Date)
27/10/2008 (essa é a saida do Date)
22:04 (essa é a saida do Date)

Bom, essa classe MutableDateTime é uma classe que uso para outras coisas aki, do JODA Time (muito util).

Bom, o que eu faço? ja nao sei mais… pq eu preciso usar o Date, e nao o MutableDateTime.

Uma coisa, se eu desmarcar a opção “Ajustar automaticamente o relógio para o horário de verão” a data do meu PC vai para 22:04, e a saida do programa acima é:

2008-10-27T22:04:16.000-03:00 (essa é a saida do MutableDateTime)
Mon Oct 27 22:04:16 BRT 2008 (essa é a saida do Date)
27/10/2008 (essa é a saida do Date)
22:04 (essa é a saida do Date)

Como vcs podem notar, a saida do JODA Time se ajustou corretamente, fazendo a compensação usando o padrão GMT-03:00, e no primeiro caso ficou com GMT-02:00, que é exatamente o que acontece para nos no horário de verão, ficamos com -2h em relação ao fuso, e nao -3h.

Alguem sabe o que devo fazer?

Acho que deve ter alguma coisa errada com seu Timezone

Saída sem o horário de verão:
Mon Oct 27 22:27:15 GMT-03:00 2008
27/10/2008
22:27

Saída com o horário de verão:
Mon Oct 27 23:28:18 BRST 2008
27/10/2008
23:28

BRST - Brazilian Summer Time -2
BRT - Brazilian Time -3

Por algum motivo a sua data está sempre saindo BRT e não está atualizando para o horário de verão.

Da uma olhada aqui:

Estou usando a versao 1.6, pode ser que em versões anteriores esse problema ocorra.

Pois é… tava pesquisando e realmente, parece que é um bug da JVM no ano de 2008. Vi que outras pessoas tb estão passando por esse problema.

Eu to usando o UPDATE 5 do JRE e UPDATE 3 do JDK.

Bom, achei esse código para corrigir o problema temporariamente:

    private void ajustarHorarioVerao2008()
    {
        SimpleDateFormat format = new SimpleDateFormat( "yyyy" );
        String dataStr = format.format( ManipulacaoDataHora.getDataHoraAtual() );
        
        int ano = Integer.valueOf( dataStr );
        
        if ( ( ano == 2008 ) || ( ano == 2009 ) )
        {
            /*
             * Realiza essa ajuste, configurando a faixa de inicio e termino do
             * horario de verao devido a um bug na JVM no ano de 2008
             */

            SimpleTimeZone stz = new SimpleTimeZone(-3 * 60 * 60 * 1000, "GMT-3:00");  
            stz.setStartRule(Calendar.OCTOBER, 3, Calendar.SUNDAY, 0);  
            stz.setEndRule(Calendar.FEBRUARY, 3, Calendar.SUNDAY, 0);  
            TimeZone.setDefault(stz); 
        }
    }

Vou colocar no meu programa temporariamente, pq eu nao tenho certeza da versão do JRE que estará sendo utilizada na maquina do cliente, e vou colocar configurável.

Vou experimentar atualizar o meu JRE/JDK.

Qual UPDATE vcs estão usando aí?

VLW

Estou usando java version “1.6.0_06”.

To terminando de baixar aki.

Atualmente eu to com o:
java version “1.6.0_05”
javac 1.6.0_03

ja esperimentou utilizar a classe calendar ao invés da date?

Ja usei o Calendar tb… mas nao deu certo.

Acho q é o esquema do BUG mesmo…

Eu usei o JDK 6 update 10 para compilar o meu programa e funcionou direitim… ou seja, foi corrigido o problema.

VLW pessoal.

Era o JDK mesmo

Fiz mais testes…

TA show agora.

VLW