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.