Somar horas com JS

A função abaixo tem o objetivo de somar duas horas passadas para ela, com a opção de zerar a hora após as 23 horas ou seguir a diante.

  1. function somaHora(hrA, hrB, zerarHora) {
  2.         if(hrA.length != 5 || hrB.length != 5) return "00:00";
  3.        
  4.         temp = 0;
  5.         nova_h = 0;
  6.         novo_m = 0;
  7.  
  8.         hora1 = hrA.substr(0, 2) * 1;
  9.         hora2 = hrB.substr(0, 2) * 1;
  10.         minu1 = hrA.substr(3, 2) * 1;
  11.         minu2 = hrB.substr(3, 2) * 1;
  12.        
  13.         temp = minu1 + minu2;
  14.         while(temp > 59) {
  15.                 nova_h++;
  16.                 temp = temp – 60;
  17.         }
  18.         novo_m = temp.toString().length == 2 ? temp : ("0" + temp);
  19.  
  20.         temp = hora1 + hora2 + nova_h;
  21.         while(temp > 23 && zerarHora) {
  22.                 temp = temp – 24;
  23.         }
  24.         nova_h = temp.toString().length == 2 ? temp : ("0" + temp);
  25.  
  26.         return nova_h + ‘:’ + novo_m;
  27. }

Como usar:

  1. novaHora = somaHora("12:00", "02:27", false);
  2. novaHora -> "14:27"
  3.  
  4. novaHora = somaHora("22:50", "05:10", true);
  5. novaHora -> "04:00"
  6.  
  7. novaHora = somaHora("22:50", "05:10", false);
  8. novaHora -> "28:00"

Comments

10 Responses to “Somar horas com JS”

  1. tiago on dezembro 17th, 2015 14:57

    Cade os segundoosss?? hehe brinks mas faltou brother =/

  2. Cesar Bagatoli on dezembro 17th, 2015 15:13

    Realmente não tem amigo, na época que criei não houve necessidade. 🙂

  3. Diego Henrique on abril 18th, 2018 0:15

    Bom Cesar, ao menos podia deixar o modo de uso bem explicativo como testar e/ou exibir o resultado um alert() por exemplo. Pois, me virei todo por aqui e não sai do lugar com teu script [não rodou]???

  4. Cesar Bagatoli on abril 18th, 2018 7:15

    Bom dia Diego, no final da matéria tem uma área chamada “Como usar”. Lá tem os exemplos de uso. Se quiser usar um “alert” para ver o resultado é só fazer o seguinte, utilizando o primeiro exemplo:
    novaHora = somaHora("12:00", "02:27", false);
    alert(novaHora);

    Qualquer outra dúvida não exite em perguntar.
    Obrigado pela visita.

  5. josue on outubro 24th, 2018 14:32

    tem como fazer 1 exemplo de media de horas?

  6. Cesar Bagatoli on outubro 25th, 2018 7:35

    Olá Josué, para fazer a média dos horários você vai precisar utilizar o resultado da soma, que pode ser obtido com esta função, transformar em minutos, dividir pela quantidade de horários que você somou e depois transformar em hora/minuto novamente. Obrigado pela visita.

  7. Jhordan on novembro 23rd, 2018 12:43

    Olá, muito bomo código, eu tenho apenas uma dúvida.

    Por que você multiplicou por 1 nas linhas 8,9,10 e 11?

  8. Cesar Bagatoli on janeiro 16th, 2019 6:26

    Olá, as linhas foram multiplicadas por 1 para forçar converter para ‘int’ estas variáveis. Obrigado.

  9. Luiz Carlos Walker on janeiro 17th, 2019 8:04

    Bom dia meu amigo, tudo bem?

    Achei muito legal seu código, só gostaria de tirar uma dúvida, de qualquer forma vou tentar adapta-lo pra chegar no resultado que preciso, mas quem sabe você pode me dar uma luz hehe.

    Preciso somar 2 valores de segundos e milésimos, por exemplo: 00:10.549 + 00:20.460 = 00:31.00 segundos

    Será que há alguma maneira possivel? Muito obrigado!

  10. Cesar Bagatoli on janeiro 28th, 2019 16:41

    Olá Luiz, se você precisar somente somar segundos e milésimos você pode dar um split pelo caractere “.”, assim você terá um array que no índice 0 serão os segundos e no índice 1 serão os milésimos, depois disse some cada um separadamente. Exemplo 02.789 + 01.987, dando explode por “.” você teria array [“02”, “789”] e outro array [“01”, “987”], somando os primeiros índices de cada array teriam 3 segundos, somando os últimos índices dos arrays você teria 1776 milisegundos, onde você trataria os milisegundos primeiramente pegando o seu “segundo” que poderia ser com $segundo = (int)(1776/1000); e depois os milisegundos restantes com $resto = 1776 % 1000;. Espero ter ajudado. Abraço

Leave a Reply