Ir ao conteúdo

Javascript Calcular tempo de um evento


Ir à solução Resolvido por Marcelo Calazans,

Posts recomendados

Postado

Pedrinho está organizando um evento em sua Universidade. O evento deverá ser no mês de Abril, iniciando e terminando dentro do mês. O problema é que Pedrinho quer calcular o tempo que o evento vai durar, uma vez que ele sabe quando inicia e quando termina o evento.

Sabendo que o evento pode durar de poucos segundos a vários dias, você deverá ajudar Pedrinho a calcular a duração deste evento.

Entrada

Como entrada, na primeira linha vai haver a descrição “Dia”, seguido de um espaço e o dia do mês no qual o evento vai começar. Na linha seguinte, será informado o momento no qual o evento vai iniciar, no formato hh : mm : ss. Na terceira e quarta linha de entrada haverá outra informação no mesmo formato das duas primeiras linhas, indicando o término do evento.

Saída

Na saída, deve ser apresentada a duração do evento, no seguinte formato:

W dia(s)
X hora(s)
Y minuto(s)
Z segundo(s)

Obs: Considere que o evento do caso de teste para o problema tem duração mínima de 1 minuto.

 

var dia_inicial = parseInt(prompt("Dia inicial"));

var hora_inicial = prompt("hora inicial");
var [horas, minutos, segundos] = hora_inicial.split(" : ").map(p => parseInt(p));

var dia_final = parseInt(prompt("Dia final"));

var hora_final = prompt("hora final");
var [hora_F, minuto_F, segundo_F] = hora_final.split(" : ").map(h => parseInt(h));

var diasT = dia_final - dia_inicial; // T de totais
var horasT = hora_F - horas;
var minutosT = minuto_F - minutos;
var segundosT = segundo_F - segundos;

if(horasT<0){
    horasT += 24;
    diasT -= 1;
}

if(minutosT<0){
    minutosT += 60;
    horasT -= 1;
}

if(segundosT<0){
    segundosT +=60;
    minutosT -= 1;
    
}


console.log("Dia "+ diasT);
console.log(horasT + " hora(s)");
console.log(minutosT + " minuto(s)");
console.log(segundosT + " segundo(s)");

 

exemplo de entrada                              exemplo de saída

Dia 5                                                         3 dia(s)
08 : 12 : 23                                               22 hora(s)
Dia 9                                                         1 minuto(s)
06 : 13 : 23                                                0 segundo(s)

Esse exemplo e outros vários deu certo, porém exemplo abaixo deu errado e não consigo achar onde está errado

Exemplo que deu erro:

 

Entrada                                   Saída

Dia 5                                        0 dia(s)

08 : 10 : 11                               23 hora(s)              -> essa é a saída correta

Dia 6                                        59 minuto(s)

08 : 09 : 11                               0 segundo(s)

 

só que no meu código sai assim:

Dia 1
 -1 hora(s)
59 minuto(s)
0 segundo(s)

 

https://www.udebug.com/URI/1061 nesse link tem vários exemplos de entrada

E pelo o que eu percebi, eu testei quase todos e funcionou, mas tem esse citado

acima que está errado.

  • Solução
Postado

@zMarlon

Olá colega.

 

No seu código, nos testes que eu fiz, sempre que a hora final (término) é menor que a hora inicial, o seu código não funciona.

 

O ideal neste tipo de cálculo com tempo, é trabalhar com o tempo todo junto, e não separado como sugere o enunciado do exercício.

 

Veja abaixo uma ideia de cálculo com tempo, usando o Date Object, que pode ser visto na referência https://www.w3schools.com/js/js_dates.asp

 

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sem título</title>
</head>

<body>

<script>
var data1 = new Date(2021,2,01,8,30,5);  /* Seria 01/02/2021 às 08:30:05  */

var data2 = new Date(2021,3,01,8,30,10); /* Seria 01/03/2021 às 08:30:10  */

var diffMs  = (data2 - data1); 
var diffDia = Math.floor(diffMs / 86400000); 
var diffHrs = Math.floor((diffMs % 86400000) / 3600000); 
var diffMin = Math.round(((diffMs % 86400000) % 3600000) / 60000);
var diffSec = Math.floor((diffMs/1000) % 60);

alert(diffDia + " dias, " + diffHrs + " horas, " + diffMin + " minutos " + diffSec + " segundos");
</script>

</body>
</html>

 

Eu sei que este seu código é um exercício, mas profissionalmente, quando se tem a ideia de pedir o dia do mês, já se tem a ideia de pedir o mês e o ano, pois eles se complementam.

 

Dizer que é dia 25, e não dizer de qual mês e de qual ano, não significa nada na verdade.

 

Sei que isto não é sua culpa, mas sim do enunciado do exercício na minha opinião.

 

Veja se consegue inserir no seu exemplo o uso do Date Object, ou aguarde para ver se algum outro colega tem uma sugestão para seu código sem o uso do Date Object.

 

Espero ter ajudado em algo.

 

Abraços e bons estudos colega.

  • Obrigado 1
Postado

 

@Marcelo Calazans

Eu adaptei o código aqui e funcionou certinho, mas o site(https://www.urionlinejudge.com.br/judge/pt/problems/view/1061) que eu estou fazendo deu como errado, pois ele quer que tenha estruturas condicionais. Não sei porque disso, na minha opinião o importante é o código funcionar, mas fazer o que né kkk.

O meu código novo:

var dia_inicial = parseInt(prompt("Dia inicial"));

var hora_inicial = prompt("hora inicial");
var [horas, minutos, segundos] = hora_inicial.split(" : ").map(p => parseInt(p));

var dia_final = parseInt(prompt("Dia final"));

var hora_final = prompt("hora final");
var [hora_F, minuto_F, segundo_F] = hora_final.split(" : ").map(h => parseInt(h));

var data1 = new Date(0,0,dia_inicial,horas,minutos,segundos);  

var data2 = new Date(0,0,dia_final,hora_F,minuto_F,segundo_F); 

var dataF  = (data2 - data1); 
var diaF = Math.floor(dataF  / 86400000); 
var horasF = Math.floor((dataF  % 86400000) / 3600000); 
var minutosF = Math.round(((dataF  % 86400000) % 3600000) / 60000);
var segundosF = Math.floor((dataF /1000) % 60);

console.log(diaF + " dia(s)");
console.log(horasF + " hora(s)");
console.log(minutosF + " minuto(s)");
console.log(segundosF + " segundo(s)");

 

  • Curtir 1
Postado
29 minutos atrás, zMarlon disse:

 

@Marcelo Calazans

Eu adaptei o código aqui e funcionou certinho, mas o site(https://www.urionlinejudge.com.br/judge/pt/problems/view/1061) que eu estou fazendo deu como errado, pois ele quer que tenha estruturas condicionais. Não sei porque disso, na minha opinião o importante é o código funcionar, mas fazer o que né kkk.

O meu código novo:


var dia_inicial = parseInt(prompt("Dia inicial"));

var hora_inicial = prompt("hora inicial");
var [horas, minutos, segundos] = hora_inicial.split(" : ").map(p => parseInt(p));

var dia_final = parseInt(prompt("Dia final"));

var hora_final = prompt("hora final");
var [hora_F, minuto_F, segundo_F] = hora_final.split(" : ").map(h => parseInt(h));

var data1 = new Date(0,0,dia_inicial,horas,minutos,segundos);  

var data2 = new Date(0,0,dia_final,hora_F,minuto_F,segundo_F); 

var dataF  = (data2 - data1); 
var diaF = Math.floor(dataF  / 86400000); 
var horasF = Math.floor((dataF  % 86400000) / 3600000); 
var minutosF = Math.round(((dataF  % 86400000) % 3600000) / 60000);
var segundosF = Math.floor((dataF /1000) % 60);

console.log(diaF + " dia(s)");
console.log(horasF + " hora(s)");
console.log(minutosF + " minuto(s)");
console.log(segundosF + " segundo(s)");

 

 

Perfeito colega é isso mesmo.

 

O legal é que você pegou a ideia, desenvolveu, adaptou e fez funcionar perfeitamente no seu exemplo.

 

É assim que se estuda, parabéns!! Fico Feliz!!

  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!