Dividir data em node.js - resolvido

Tenho esta hora em 23 hs 59 min 42 seg e este valor 278

Preciso transformar em horas e depois dividir pelo valor

23:59:42 / 278 = 00:05:11

Vi que em node, tem a função new Date(). Mas não entendi como utillizar

Esse número 278 é o que?

1 curtida

É o retorno de uma consulta ao banco

Ah, entendi agora, deve ser horas. Agora que reparei no cálculo que tu colocou.

1 curtida

horas divido por numero e o resultado em horas

Primeiro a gente precisa entender a diferença entre datas/horas e durações. Por exemplo, nas duas frases abaixo:

  1. A reunião será às duas horas
  2. A reunião durou duas horas

Na primeira frase, “duas horas” refere-se ao horário (ao momento específico do dia). Na segunda frase, “duas horas” é a duração (uma quantidade de tempo), ela não diz quando a reunião começou ou terminou, só diz quanto tempo ela durou.

O problema é que ambos usam as mesmas palavras (“horas”, “minutos” e "segundos), e ambos podem ser mostrados da mesma forma: um relógio pode mostrar 02:00:00 para indicar o horário das duas horas, e um cronômetro pode mostrar 02:00:00 para indicar que já se passaram duas horas. Mas eles são conceitos diferentes (relacionados, porém distintos).

E por que toda essa introdução? Porque datas/horas e durações são coisas diferentes, e Date só serve para trabalhar com um deles (datas/horas). No JavaScript não tem uma forma direta de trabalhar com durações (no futuro, se tudo der certo, teremos), então você precisa fazer tudo na mão.


Enfim, no seu caso o que você tem é uma duração, e não uma data. Não faz sentido dividir “duas da tarde” por um número (já dividir uma duração de duas horas por um número faz). Por isso não adianta tentar usar Date (qualquer “solução” que sugerirem com Date será gambiarra, mesmo que “funcione”).

No seu caso, uma solução seria obter o total de segundos, fazer a divisão (arredondando) e depois converter de volta para a quantidade de horas, minutos e segundos.

Não está claro qual o formato que você recebe (se é 23 hs 59 min 42 seg ou 23:59:42), mas enfim, seria algo assim:

var duracao = '23:59:42';

// separa os valores de cada unidade
var [horas, minutos, segundos] = duracao.split(':').map(v => parseInt(v));

// obtém a duração total em segundos
var totalSegundos = (horas * 3600) + (minutos * 60) + segundos;
// divide por 278, e arredonda
totalSegundos = Math.round(totalSegundos / 278);

// agora extrai a quantidade de horas, minutos e segundos deste total
horas = Math.floor(totalSegundos / 3600);
// desconta o total de horas, assim o que sobra corresponde aos minutos e segundos
totalSegundos %= 3600;
minutos = Math.floor(totalSegundos / 60);
// desconta o total de minutos, assim o que sobra corresponde aos segundos
totalSegundos %= 60;

// retorna o valor com zero à esquerda caso necessário (ex: "2" vira "02")
function pad(v) {
    return v.toString().padStart(2, '0');
}

// formata o valor
var duracaoFinal = `${pad(horas)}:${pad(minutos)}:${pad(totalSegundos)}`;
console.log(duracaoFinal); // 00:05:11

Se o formato da duração inicial for outro, ficaria um pouco diferente:

var duracao = '23 hs 59 min 42 seg';
var match = /(\d+) hs (\d+) min (\d+) seg/.exec(duracao);

// separa os valores de cada unidade
var [horas, minutos, segundos] = match.slice(1, 4).map(v => parseInt(v));

// o resto é igual...
1 curtida