Somar horas (sem data - Apenas horas) [RESOLVIDO]

Senhores, tenho um método que gera dados para um relatório e surgiu uma necessidade que está me segurando um pouco.

O sistema é antigo, já bastante funcional porém surgiu a necessidade de adicionar uma informação a mais neste relatório. Já existe um campo ‘duracao’ que é a duração em horas de um determinado evento. Esta ‘duracao’ é uma String. Como já funciona há bastante tempo a primeira solução que me veio em mente foi armazenar estes valores em uma lista, e simplesmente somá-los.

ex:

// Depois de populada a lista
def duracaoTotal;
def duracao = ['00:04:25','01:25:04','00:03:21','04:12:51','04:07:40','01:00:00'] 
for(i=0; i<lista.size(); i++){
    duracaoTotal += duracao[i]
}

Com inteiros funcionaria beleza… Alguma idéia de como posso somar apenas as horas?>

Repare que isso é uma String e que vc quer pegar apenas os primeiros caracteres

String hora1= "03:04:25";
String hora2= "02:04:25";
int horaInt=Integer.parseInt(hora1.substring(0,2));
int horaInt2=Integer.parseInt(hora2.substring(0,2));
int somaHora=horaInt+horaInt2;

Olá, obrigado pela dica! Mas acredito que isso geraria um problema:

para horas de repente funcionaria beleza, mas… para minutos ou segundos já não daria certo.
Observe:

String hora1= "03:04:25";  
String hora2= "02:04:25";  
int horaInt=Integer.parseInt(hora1.substring(0,2));  
int horaInt2=Integer.parseInt(hora2.substring(0,2));  
int somaHora=horaInt+horaInt2;

Seu pensamento é válido mas não resolve para este caso. Considerando por exemplo os horários que você passou se os minutos forem mais altos:

String hora1= "03:45:25";  
String hora2= "02:24:25";  
int horaInt=Integer.parseInt(hora1.substring(0,2));  
int horaInt2=Integer.parseInt(hora2.substring(0,2));  
int somaHora=horaInt+horaInt2;

depois de realizado os tratamentos com substring nos minutos e segundos a saída seria: “05:69:50”… 69 minutos não funciona. O resultado deveria ser “06:09:50”

Procura na API das classes Calendar, Date ou Time, deve ter algum método para calcular isso.

Se não tiver, faça um, que soma horas respeitando o fato de 60 segundos, aumanta um minuto, 60 minutos, aumenta uma hora, 24 horas aumenta um dia, etc…

Essa só foi uma maneira.
Você pode usar o split
e fazer as lógica de minuto, segundo e hora

		String hora1= "03:04:25";    
		    
		String[] tempo= hora1.split(":");
		int hora=Integer.parseInt(tempo[0]);
		int minuto =Integer.parseInt(tempo[1]);
		int segundo=Integer.parseInt(tempo[2]);
		
		

Opa drigo.angelo… Blz?

Eu vi a documentação sugerida, estou vendo tambem o JodaTime… A questão maior, é que para a minha necessidade o dia não importa. Este relatório já é funcional há muito tempo. com o campo duracao (se houver no respectivo evento), esse campo ‘duracao’ trás uma string exibindo uma hora como mencionei… Preciso apenas adicionar um “Total” no fim do relatório, mostrando a soma das durações… os dias em questão não são necessários… por isso havia pensado em guardar estas durações em uma lista, e percorrê-la somando seu conteúdo…

Senhores, obrigado pela colaboração de todos. Otávio, peguei uma carona no seu conselho e resolvi o problema.

def somaHora(List duracoes) { 
String horas    = "00";  
String minutos  = "00";  
String segundos = "00";  
         
int sub = 0;  
int subHoras = 0;  
int subMinutos = 0; 
def total = "" 
    
for (i = 0; i < duracoes.size(); i++) {
    if (duracoes[i] != '') {
int horaEmSegundos1 = (Integer.parseInt(duracoes[i].substring(0,2))*3600)+(Integer.parseInt(duracoes[i].substring(3,5))*60)+Integer.parseInt(duracoes[i].substring(6,8));             
    sub += horaEmSegundos1
    }
}       
       if ( sub >= 3600) {  
          subHoras = (sub - (sub % 3600)) / 3600;  
          sub = sub - (subHoras * 3600);  
          if (subHoras < 10) {  
             horas = "0"+Integer.toString(subHoras);  
          }  
          else {  
             horas = Integer.toString(subHoras);  
          }  
       }        
   
       if ( sub >= 60) {  
          subMinutos = (sub - (sub % 60)) / 60;  
          sub = sub - (subMinutos * 60);  
          if (subMinutos < 10) {  
             minutos = "0"+Integer.toString(subMinutos);  
          }  
          else {  
             minutos = Integer.toString(subMinutos);  
          }  
       }     
   
       if (sub < 10) {  
          segundos = "0" + Integer.toString(sub);  
       }  
       else {  
          segundos = Integer.toString(sub);  
       }
         
       total = "$horas:$minutos:$segundos"

       //println total
    }
    // chamando o método
    somaHora(['01:04:25','', '00:25:32', '04:37:18','','01:25:04','00:03:21','04:12:51','04:07:40','01:00:00', '11:05:12'])

Talvez utilizando o .split ficasse até mais organizado… mas aí já atende bem a necessidade.