Ir ao conteúdo
  • Cadastre-se

Javascript Calcular tempo de um evento


Ir à solução Resolvido por Marcelo Calazans,

Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

 

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...