Obter diferença de horário entre duas datas em segundos


149

Estou tentando obter uma diferença entre duas datas em segundos. A lógica seria assim:

  • defina uma data inicial que seria agora;
  • defina uma data final que seria a data inicial mais alguns segundos no futuro (digamos 15 por exemplo)
  • obtenha a diferença entre os dois (a quantidade de segundos)

A razão pela qual faço isso com datas é porque a data / hora final depende de algumas outras variáveis ​​e nunca é a mesma (depende da rapidez com que um usuário faz alguma coisa) e também guardo a data inicial para outras coisas.

Eu tenho tentado algo assim:

var _initial = new Date(),
    _initial = _initial.setDate(_initial.getDate()),
    _final = new Date(_initial);
    _final = _final.setDate(_final.getDate() + 15 / 1000 * 60);

var dif = Math.round((_final - _initial) / (1000 * 60));

O problema é que nunca entendi a diferença certa. Tentei dividir pelo 24 * 60que me deixaria com os segundos, mas nunca entendi direito. Então, o que há de errado com a minha lógica? Eu posso estar cometendo algum erro estúpido, já que é muito tarde, mas me incomoda que eu não consiga fazê-lo funcionar :)


2
A ordem das operações é fundamental.
Dylan Cruz

1
Então, você gostaria de ter um carimbo de data / hora, adicione 15 segundos e veja qual é a diferença em segundos. Eu diria que as chances são altas de que a diferença será .... espere ... 15 segundos?
Adnet15:


1
Eu realmente entendo o que você está tentando fazer (eu acho), mas se você usar o novo Date (), que é a hora do unix agora, adicione 15 segundos e verifique imediatamente a diferença, a diferença será de 15 segundos (menos os milissegundos necessários para calcular), mas acho que sua intenção é comparar isso de alguma forma no futuro.
22412 adeneo

1
Eu realmente não entendo, para provar meu ponto, aqui está um FIDDLE de trabalho para o seu exemplo acima. Se você está tentando descobrir quanto tempo o usuário levou para fazer alguma coisa, normalmente obtém o carimbo de data / hora quando o usuário inicia a operação e o carimbo de data e hora quando o usuário termina a operação, e compara-os, e você sabe quanto tempo levou. . Para que diabos são os 15 segundos?
adeneo

Respostas:


283

O código

var startDate = new Date();
// Do your operations
var endDate   = new Date();
var seconds = (endDate.getTime() - startDate.getTime()) / 1000;

Ou ainda mais simples, (endDate - startDate) / 1000como indicado nos comentários, a menos que você esteja usando texto datilografado.


A explicação

Você precisa chamar o getTime()método para os Dateobjetos e simplesmente subtraí-los e dividir por 1000 (já que é originalmente em milissegundos). Como um extra, quando você está chamando o getDate()método, na verdade, está recebendo o dia do mês como um número inteiro entre 1 e 31 (não com base em zero), em oposição ao tempo de época que você teria ao chamar o getTime()método, representando o número de milissegundos desde 1º de janeiro de 1970, 00:00


Rant

Dependendo das operações relacionadas à data, convém investir na integração de uma biblioteca como date.js ou moment.js, que facilitam muito as coisas para o desenvolvedor, mas isso é apenas uma questão de preferência pessoal.

Por exemplo, em moment.js , faríamos o moment1.diff(moment2, "seconds")que é bonito.


Documentos úteis para esta resposta


14
Não há necessidade de getTIme , as datas podem ser subtraídas uma da outra, pois o operador - as coagirá ao Numbers.
RobG

3
getTime é necessário se você usar typescript não permitir a operação aritmética entre elemento diferente de qualquer número ou enum
zaffaste

Você pode usar .valueOf(), que é o que o -operador chamaria em qualquer caso ...
Heretic Monkey 26/16

1
Que tal se precisarmos também das diferenças horárias hora / minuto ...? Devo dividi-lo por 60 ou vários deles ...? @Juan
gumuruh 15/03

Por favor, adicionar novas dúvidas quanto questões individuais, mas já que esta provavelmente seria fechada como uma duplicata, dê uma olhada aqui stackoverflow.com/questions/1322732/...
Juan Cortés

5

Você pode usar new Date().getTime()para obter carimbos de data e hora. Então você pode calcular a diferença entre o final e começar e, finalmente, transformar o timestamp que é mspara s.

const start = new Date().getTime();
const end = new Date().getTime();

const diff = end - start;
const seconds = Math.floor(diff / 1000 % 60);

4
<script type="text/javascript">
var _initial = '2015-05-21T10:17:28.593Z';
var fromTime = new Date(_initial);
var toTime = new Date();

var differenceTravel = toTime.getTime() - fromTime.getTime();
var seconds = Math.floor((differenceTravel) / (1000));
document.write('+ seconds +');
</script>

1

O código abaixo dará a diferença de tempo em segundo.

var date1 = new Date(); // current date
var date2 = new Date("06/26/2018"); // mm/dd/yyyy format
var timeDiff = Math.abs(date2.getTime() - date1.getTime()); // in miliseconds
var timeDiffInSecond = Math.ceil(timeDiff / 1000); // in second

alert(timeDiffInSecond );

0

tente usar funções dedicadas de linguagens de programação de alto nível. O JavaScript .getSeconds();combina aqui:

var specifiedTime = new Date("November 02, 2017 06:00:00");
var specifiedTimeSeconds = specifiedTime.getSeconds(); 

var currentTime = new Date();
var currentTimeSeconds = currentTime.getSeconds(); 

alert(specifiedTimeSeconds-currentTimeSeconds);

0

Diferença de hora entre agora e 10 minutos depois, usando momentjs

let start_time = moment().format('YYYY-MM-DD HH:mm:ss');
let next_time = moment().add(10, 'm').format('YYYY-MM-DD HH:mm:ss');

let diff_milliseconds = Date.parse(next_time) - Date.parse(star_time);
let diff_seconds = diff_milliseconds * 1000;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.