Erro ao apresentar horas [RESOLVIDO]

Bom dia, pessoal!!!
Eu estou fazendo um projeto no qual ele calcula a diferença entre o horário atual (que posso chamar de inicial) e o horário final, no qual esta diferença deve der apresentada em um label, alterando a cada 1 minuto.
Construi o seguinte código:

import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author vanessa
 */
public class Indicador {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws ParseException {
        IndicadorDiario indicadorDiario= new IndicadorDiario();
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
 

    int minutos = 0;
    int horas = 0;
        
    indicadorDiario.setVisible(true);

     
     DateFormat fm = new SimpleDateFormat("HH:mm:ss");
      Date data1 = fm.parse("16:00:00");
      
        while (true) {

       fm = new SimpleDateFormat("HH:mm:ss");
      Date data2 = fm.parse("15:35:15"); // ESTE HORÁRIO INICIAL É APENAS PARA TESTE, EU TENHO QUE PEGAR O HORÁRIO ATUAL, ALTERADO A CADA UM SEGUNDO

      // vamos obter a diferença em semanas, dias, horas,
      // minutos e segundos
      long segundos = (data1.getTime() - data2.getTime()) / 1000;
//      int semanas = (int)Math.floor(segundos / 604800);
//      segundos -= semanas * 604800;
//      int dias = (int)Math.floor(segundos / 86400);
//      segundos -= dias * 86400;
      int horas1 = (int)Math.floor(segundos / 3600);
      segundos -= horas * 3600;
      int minutos1 = (int)Math.floor(segundos / 60);
      segundos -= minutos * 60;

      // exibe o resultado
      System.out.println("As duas datas tem " +horas1+" horas, " + minutos1 + " minutos e " +segundos + " segundos de diferença");

            GregorianCalendar d = new GregorianCalendar();
            minutos = d.get(Calendar.MINUTE);
            System.out.println("Minutos " + minutos);

            horas = d.get(Calendar.HOUR_OF_DAY);
            System.out.println("Horas " + horas);

            IndicadorDiario.jLabel8.setText(String.valueOf(horas
                    )+':'+String.valueOf(minutos)); 
        }  
 }
     
}

Porém, os resultados que são apresentados são:
As duas datas tem 0 horas, 24 minutos e 1485 segundos de diferença
Minutos 38
Horas 8
As duas datas tem 0 horas, -455 minutos e -29595 segundos de diferença (permanece infinitamente apresentando esta linha, sem alterações)
Minutos 38
Horas 8

O primeiro resultado está correto, mas, ele deve alterar a cada um segundo, como eu faço esta alteração?

Também gostaria de apresentar as horas no formato mais convencional, ou seja, se horas menores do que 10, apresentarem seus valores com o 0 (zero) na frente: 01, 02, etc, o mesmo para os minutos, porém, o meu código, apresenta este valor inteiro: 1, 2, etc. A uma função que insere este 0?

Grata a todos!

Que bagunça esse seu código, não da pra entender nada…

Primeiro de tudo, não use java.util.Date para manipular horarios e datas, é muito ruim, prefira o java.util.Calendar !

Então, você só precisa comparar 2 horários e apresentar a diferença entre os dois, é isso ?

Por exemplo:

Data A = 25/05/2011 14:00

Data B = 25/05/2011 20:00

Diferença entre A e B = 6 horas

é isso ?

Lamento se meu código está confuso, pois tentei deixá-lo o mais claro possível, tentarei inserir mais comentários da próxima vez para assim deixá-lo mais simples.

É exatamente esta comparação que eu preciso fazer e apresentar a diferença. E como eu calculo esta diferença utilizando o java.util.Calendar?

Obrigada!

Vanesa…fiz um código corrido aqui, da pra melhorar muito ainda, mas para o seu caso, acho que serve, dê uma olhada:

public static String verificaDiferenca(Calendar dataA,Calendar dataB)
	{
		//Verifica a diferença entre ANOS
		int anos = 0;
		if(dataA.get(Calendar.YEAR) > dataB.get(Calendar.YEAR))
		{
			anos = dataA.get(Calendar.YEAR) - dataB.get(Calendar.YEAR);
		}
		else if(dataA.get(Calendar.YEAR) < dataB.get(Calendar.YEAR))
		{
			anos = dataB.get(Calendar.YEAR) - dataA.get(Calendar.YEAR);
		}
		
		//Verifica a diferença entre MÊSES
		int meses = 0;
		if(dataA.get(Calendar.MONTH) > dataB.get(Calendar.MONTH))
		{
			meses = dataA.get(Calendar.MONTH) - dataB.get(Calendar.MONTH);
		}
		else if(dataA.get(Calendar.MONTH) < dataB.get(Calendar.MONTH))
		{
			meses = dataB.get(Calendar.MONTH) - dataA.get(Calendar.MONTH);
		}
		
		//Verifica a diferença entre DIAS
		int dias = 0;
		if(dataA.get(Calendar.DAY_OF_MONTH) > dataB.get(Calendar.DAY_OF_MONTH))
		{
			dias = dataA.get(Calendar.DAY_OF_MONTH) - dataB.get(Calendar.DAY_OF_MONTH);
		}
		else if(dataA.get(Calendar.DAY_OF_MONTH) < dataB.get(Calendar.DAY_OF_MONTH))
		{
			dias = dataB.get(Calendar.DAY_OF_MONTH) - dataA.get(Calendar.DAY_OF_MONTH);
		}
		
		//Verifica a diferença entre HORAS
		int horas = 0;
		if(dataA.get(Calendar.HOUR_OF_DAY) > dataB.get(Calendar.HOUR_OF_DAY))
		{
			horas = dataA.get(Calendar.HOUR_OF_DAY) - dataB.get(Calendar.HOUR_OF_DAY);
		}
		else if(dataA.get(Calendar.HOUR_OF_DAY) < dataB.get(Calendar.HOUR_OF_DAY))
		{
			horas = dataB.get(Calendar.HOUR_OF_DAY) - dataA.get(Calendar.HOUR_OF_DAY);
		}
		
		//Verifica a diferença entre MINUTOS
		int minutos = 0;
		if(dataA.get(Calendar.MINUTE) > dataB.get(Calendar.MINUTE))
		{
			minutos = dataA.get(Calendar.MINUTE) - dataB.get(Calendar.MINUTE);
		}
		else if(dataA.get(Calendar.MINUTE) < dataB.get(Calendar.MINUTE))
		{
			minutos = dataB.get(Calendar.MINUTE) - dataA.get(Calendar.MINUTE);
		}
		
		//Verifica a diferença entre SEGUNDOS
		int segundos = 0;
		if(dataA.get(Calendar.SECOND) > dataB.get(Calendar.SECOND))
		{
			segundos = dataA.get(Calendar.SECOND) - dataB.get(Calendar.SECOND);
		}
		else if(dataA.get(Calendar.SECOND) < dataB.get(Calendar.SECOND))
		{
			segundos = dataB.get(Calendar.SECOND) - dataA.get(Calendar.SECOND);
		}
		
		//Verifica se são diferentes
		boolean diferente = (anos + meses + dias + horas + minutos + segundos) > 0;
		
		if(diferente)
		{
			StringBuilder retorno = new StringBuilder("A diferença entre as duas datas é de ");
			retorno.append("\n"+anos+" ano(s)");
			retorno.append("\n"+meses+" mês(es)");
			retorno.append("\n"+dias+" dia(s)");
			retorno.append("\n"+horas+" hora(s)");
			retorno.append("\n"+minutos+" minuto(s)");
			retorno.append("\n"+segundos+" segundo(s)");
			return retorno.toString();
		}
		else
			return "As duas datas são identicas";
	}

Aqui um exemplo:

public static void main(String[] args) 
	{
		Calendar atual = Calendar.getInstance();
		Calendar antigamente = Calendar.getInstance();
		antigamente .set(Calendar.DAY_OF_MONTH, atual.get(Calendar.DAY_OF_MONTH)-1);
		antigamente .set(Calendar.YEAR,1992);
		System.out.println(verificaDiferenca(atual, antigamente));
	}

A saída será:

A diferença entre as duas datas é de
20 ano(s)
0 mês(es)
1 dia(s)
0 hora(s)
0 minuto(s)
0 segundo(s)
[color=green] [/color]

Guilherme, muito obrigada pela sua ajuda, porém meu problema permanece :frowning: , pois eu tenho que apresentar a diferença entre dois horário de um dia apenas, apresentando o horário atual e a sua diferença a cada um MINUTO, em label`s. Exemplo:

Hora atual: 10:00
Hora final: 12:00
DIFERENÇA: 02:00

Um minuto depois:
Hora atual: 10:01
Hora final: 12:00
DIFERENÇA: 01:59

A hora final não altera, o que se deve alterar é a diferença.

Obrigada!

[quote=vanessa.tenorio]Guilherme, muito obrigada pela sua ajuda, porém meu problema permanece :frowning: , pois eu tenho que apresentar a diferença entre dois horário de um dia apenas, apresentando o horário atual e a sua diferença a cada um MINUTO, em label`s. Exemplo:

Hora atual: 10:00
Hora final: 12:00
DIFERENÇA: 02:00

Um minuto depois:
Hora atual: 10:01
Hora final: 12:00
DIFERENÇA: 01:59

A hora final não altera, o que se deve alterar é a diferença.

Obrigada! [/quote]

Então Vanessa, da uma olhada no código que te passei, dá uma modificada para o seu caso…se tiver dúvidas pode perguntar que te ajudo, mas não posso pensar por você né ? rsrs…

Deve criar sua lógica.

Guilherme, muito obrigada pelo apoio, mas no código que você me sugeriu, eu também já havia concluído, este é um dos motivos que meu código anterior estava muito confuso, fiz n-modificações :frowning:

Mas, enfim, agradeço a sua contribuição. Qualquer novidade eu informo! =)

Pessoal,
eu estava estudando e pesquisando classes, métodos e funções que trabalham com tempo. Enfim, resolvi meu problema. =))

O código abaixo mostra no label8: o horário atual e no label9: a diferença entre o horário final, que estabeleci como sendo as 18h00, e o horário atual. Ambos os label`s tem suas informações alteradas a cada um minuto.

import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author vanessa
 */
public class IndicadorPainel {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws ParseException {
        int minutos = 0;
        int horas = 0;
        
        IndicadorDiario indicadorDiario = new IndicadorDiario();
       indicadorDiario.setVisible(true);

        while (true) {

            GregorianCalendar d = new GregorianCalendar();
            minutos = d.get(Calendar.MINUTE);
            System.out.println("Minutos " + minutos);

            horas = d.get(Calendar.HOUR_OF_DAY);
            System.out.println("Horas " + horas);



            System.out.println(subtraiHora("18:00", horas + ":" + minutos)); //estabelecido 18:00 como sendo o horário final


            IndicadorDiario.jLabel8.setText(String.valueOf(horas) + ':' + String.valueOf(minutos));

            indicadorDiario.jLabel9.setText(subtraiHora("18:00", horas + ":" + minutos));


        }
    }

    public static String subtraiHora(String hora, String hora2) {
        long segundos1 = TimeUnit.HOURS.toSeconds(Integer.valueOf(hora.split(":")[0])) + TimeUnit.MINUTES.toSeconds(Integer.valueOf(hora.split(":")[1]));
        long segundos2 = TimeUnit.HOURS.toSeconds(Integer.valueOf(hora2.split(":")[0])) + TimeUnit.MINUTES.toSeconds(Integer.valueOf(hora2.split(":")[1]));
        long totalSegundos = segundos1 - segundos2;
        long rHora = totalSegundos / 3600;
        long rMinuto = totalSegundos % 3600 / 60;

        return rHora + ":" + rMinuto;
    }
}

Caso o meu código esteja confuso, favor me informar que posso estar explicando melhor =))
Para qualquer dúvida, estou a disposição.