Quanti secondi tra due date?


180

Quindi ho due date YYYY-MM-DDeZZZZ-NN-EE

Come posso scoprire quanti secondi ci sono tra loro?


173
Cerco di lasciare almeno mezz'ora tra le date per evitare di essere catturato.
Don Branson,

yyyy-MM-ddè chiaro (anno, mese, giorno-nota che non sono tutti in maiuscolo), ma ZZZZ-NN-EE non è così. Lo interpreto come (fuso orario, ???, giorno per settimana). È una settimana all'anno? Se fosse così, sarebbe stato ww. Ma comunque abbiamo bisogno anche dell'anno per calcolare la differenza. Potete per favore fornire alcuni dei valori di campionamento effettivi?
BalusC

7
@BalusC: credo che sia appena passato alle lettere successive per indicare un secondo appuntamento (Y -> Z, M -> N e D -> E). L'uso di nomi di variabili come startDate ed endDate sarebbe probabilmente stato migliore.
Austin Salonen,

Ah, capisco. Questo avrebbe potuto essere chiesto molto più chiaramente.
BalusC

Risposte:


242

Sto prendendo AAAA e ZZZZ per indicare i valori interi che indicano l'anno, MM e NN per indicare i valori interi che indicano il mese dell'anno e GG ed EE come valori interi che indicano il giorno del mese.

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);

Una fonte utile per riferimento futuro è il sito MDN

In alternativa, se le tue date sono in un formato javascript può analizzare

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

e quindi puoi usare quel valore come differenza in millisecondi (dif in entrambi i miei esempi ha lo stesso significato)


1
Solo i modelli utilizzati nell'esempio non sono esatti. Gli anni a 4 cifre sono indicati da lettere minuscole yyyy, da 2 cifre mesi da lettere maiuscole MMe da 2 cifre giorni da lettere minuscole dd.
BalusC

1
Martin, ho l'impressione che non stia usando alcun modello di data qui. MM DD, YYYY e NN EE, ZZZZ sono in realtà i "valori di esempio" che Steven ha chiesto. Quindi, in altre parole, non sta facendo alcun tipo di formattazione.
Wagner Silveira,

Ho aggiornato il secondo esempio, che è quello di cui tutti si stavano confondendo. Ho anche aggiunto un po 'di chiarimenti su come sto interpretando i valori forniti nel suo esempio.
Martin,

La tua seconda variabile deve essere chiamata t2.
Kees C. Bakker,

Nella maggior parte dei casi probabilmente farai t2 - t1, non t1 - t2
UpTheCreek

83

Sottrai solo:

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 - allora sta succedendo qualcosa di divertente! Controlla i valori di ae be assicurati che siano Date.
Seth,

@Seth hai ragione, quindi ho eliminato il mio commento .. una delle mie "date" era in realtà una stringa. Funziona perfettamente.
user3344977,

14

Se una o entrambe le date sono in futuro, temo che tu sia SOL se vuoi la precisione al secondo. Il tempo UTC ha secondi saltati che non sono noti fino a circa 6 mesi prima che si verifichino, quindi eventuali date oltre a quella possono essere imprecise per un certo numero di secondi (e in pratica, poiché le persone non aggiornano le loro macchine così spesso, tu potrebbe scoprire che in qualsiasi momento in futuro è spento per un certo numero di secondi).

Questo dà una buona spiegazione della teoria della progettazione di librerie di data / ora e perché è così: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 per aver menzionato il secondo salto! È così frustrante quando questo viene maltrattato, anche da persone che dovrebbero conoscerlo meglio (commissione POSIX, ti sto guardando ...)
Jim Lewis,

1
Vale la pena ricordare che lo standard ECMA ignora esplicitamente i secondi bisestili (ovvero: anche i secondi bisestili passati ): nel tempo i valori dei secondi saltati vengono ignorati. Si presume che ci siano esattamente 86.400.000 millisecondi al giorno .
Sylvain Leroux,

11

Puoi farlo semplicemente.

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

Modo semplice:

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

In bash:

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

Richiede l'installazione di bc e gnu date.


1
Come è rilevante?
Abbandono il

-10

.Net fornisce la classe TimeSpan per fare la matematica per te.

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, potresti voler eliminare questa risposta in modo da non perdere punti. Hanno chiesto il codice sorgente JavaScript, anziché il codice sorgente Visual Basic.
MacGyver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.