Quantos segundos entre duas datas?


180

Então, eu tenho duas datas YYYY-MM-DDeZZZZ-NN-EE

Como posso descobrir quantos segundos existem entre eles?


173
Tento deixar pelo menos meia hora entre as datas para não ser pego.
— Don Branson

yyyy-MM-ddé claro (ano, mês, dia - observe que nem todas são maiúsculas), mas ZZZZ-NN-EE não é. Eu interpreto como (fuso horário, ???, dia da semana). É uma semana do ano? Se assim fosse, teria sido ww. Mas ainda assim precisamos do ano para calcular a diferença. Você pode fornecer alguns dos valores reais da amostra?
— precisa saber é o seguinte

7
@BalusC: Eu acredito que ele foi às próximas letras para indicar uma segunda data (Y -> Z, M -> N e D -> E). Usar nomes de variáveis ​​como startDate e endDate provavelmente teria sido melhor.
— Austin Salonen

Ah entendo. Isso poderia de fato ter sido solicitado com muito mais clareza.
— precisa saber é o seguinte

Respostas:


242

Estou usando YYYY & ZZZZ para significar valores inteiros que significam o ano, MM & NN para significar valores inteiros, significando o mês do ano, e DD & EE como valores inteiros, significando o dia do mês.

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

Uma fonte útil para referência futura é o site MDN

Como alternativa, se suas datas estiverem em um formato, o javascript poderá analisar

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

e então você pode usar esse valor como a diferença em milissegundos (dif nos dois exemplos tem o mesmo significado)


1
Apenas os padrões usados ​​no exemplo não estão corretos. Os anos de 4 dígitos são anotados em minúsculas yyyy, os meses de 2 dígitos em maiúsculas MMe os dias de 2 dígitos em minúsculas dd.
— precisa saber é o seguinte

1
Martin, tenho a impressão de que não estava usando nenhum padrão de data aqui. MM DD, AAAA e NN EE, ZZZZ são realmente os "valores de exemplo" que Steven perguntou. Então, em outras palavras, ele não está fazendo nenhum tipo de formatação.
— Wagner Silveira

Atualizei o segundo exemplo, que é sobre o que acho que todo mundo estava ficando confuso. Também adicionei um pouco de esclarecimento sobre exatamente como estou interpretando os valores dados em seu exemplo.
— Martin

Sua segunda variável precisa ser chamada t2.
— Kees C. Bakker

Na maioria dos casos você provavelmente estará fazendo t2 - t1, não t1 - t2
— UpTheCreek

83

Apenas subtraia:

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

alert("You waited: " + difference + " seconds");

@ user3344977 - então algo engraçado está acontecendo! Verifique os valores de ae be certifique-se de que eles são datas.
— Seth

@Seth você está correto, então eu apaguei meu comentário .. uma das minhas "datas" era na verdade uma string. Isso funciona perfeitamente.
— user3344977

14

Se uma ou ambas as datas estiverem no futuro, receio que você seja SOL, se quiser precisão de um segundo. O horário UTC tem segundos bissextos que não são conhecidos até cerca de 6 meses antes de eles acontecerem; portanto, qualquer data além disso pode ser imprecisa em alguns segundos (e, na prática, como as pessoas não atualizam suas máquinas com tanta frequência, você pode achar que a qualquer momento no futuro está desativado por alguns segundos).

Isso fornece uma boa explicação da teoria do design de bibliotecas de data / hora e por que isso ocorre: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 por mencionar a segunda edição do salto! É tão frustrante quando isso fica encravado, mesmo por pessoas que deveriam saber melhor (comitê POSIX, eu estou olhando para você ...)
— Jim Lewis

1
Vale ressaltar que o padrão ECMA ignora explicitamente os segundos bissextos (ou seja, mesmo os segundos bissextos passados ): os valores no tempo os segundos bissextos são ignorados. Supõe-se que haja exatamente 86.400.000 milissegundos por dia .
— Sylvain Leroux

11

Você pode fazer isso simplesmente.

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);


4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);

0

Jeito fácil:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));

-3

Na festança:

bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

Requer a instalação de data bc e gnu.


1
Como isso é relevante?
— Dropout

-10

.Net fornece a classe TimeSpan para fazer as contas para você.

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds

@ Jeff, você pode querer excluir esta resposta para não perder pontos. Eles pediram o código-fonte JavaScript, em vez do código-fonte do Visual Basic.
— MacGyver
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.