Wie viele Sekunden zwischen zwei Daten?


180

Also habe ich zwei Termine YYYY-MM-DDundZZZZ-NN-EE

Wie kann ich herausfinden, wie viele Sekunden zwischen ihnen liegen?


173
Ich versuche, zwischen den Daten mindestens eine halbe Stunde Zeit zu lassen, um nicht erwischt zu werden.
Don Branson

yyyy-MM-ddist klar (Jahr, Monat, Tag - beachten Sie, dass sie nicht alle in Großbuchstaben geschrieben sind), aber ZZZZ-NN-EE nicht. Ich interpretiere es als (Zeitzone, ???, Tag in Woche). Ist es Woche im Jahr? Wenn ja, wäre das gewesen ww. Aber trotzdem brauchen wir auch das Jahr, um die Differenz zu berechnen. Können Sie bitte einige der tatsächlichen Stichprobenwerte angeben?
BalusC

7
@BalusC: Ich glaube, er ist gerade zu den nächsten Buchstaben gegangen, um ein zweites Datum anzugeben (Y -> Z, M -> N und D -> E). Die Verwendung von Variablennamen wie startDate und endDate wäre wahrscheinlich besser gewesen.
Austin Salonen

Ah ich sehe. Dies hätte in der Tat viel klarer gefragt werden können.
BalusC

Antworten:


242

Ich nehme JJJJ & ZZZZ als Ganzzahlwerte, die das Jahr bedeuten, MM & NN als Ganzzahlwerte, die den Monat des Jahres bedeuten, und TT & EE als Ganzzahlwerte, die den Tag des Monats bedeuten.

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

Eine praktische Quelle für zukünftige Referenz ist die MDN-Site

Wenn Ihre Daten in einem Format vorliegen, kann Javascript alternativ analysiert werden

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

und dann können Sie diesen Wert als Differenz in Millisekunden verwenden (dif in beiden meiner Beispiele hat die gleiche Bedeutung)


1
Nur die im Beispiel verwendeten Muster sind nicht so richtig. 4-stellige Jahre werden in Kleinbuchstaben yyyy, 2-stellige Monate in Großbuchstaben MMund 2-stellige Tage in Kleinbuchstaben angegeben dd.
BalusC

1
Martin, ich habe den Eindruck, dass hier keine Datumsmuster verwendet wurden. MM TT, JJJJ und NN EE, ZZZZ sind eigentlich die "Beispielwerte", die Steven gefragt hat. Mit anderen Worten, er macht keinerlei Formatierung.
Wagner Silveira

Ich habe das zweite Beispiel aktualisiert, worüber wohl alle verwirrt waren. Ich habe auch ein wenig Klarheit darüber hinzugefügt, wie ich die in seinem Beispiel angegebenen Werte genau interpretiere.
Martin

Ihre zweite Variable muss aufgerufen werden t2.
Kees C. Bakker

In den meisten Fällen werden Sie wahrscheinlich t2 - t1 machen, nicht t1 - t2
UpTheCreek

82

Subtrahieren Sie einfach:

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 - dann ist etwas lustiges los! Überprüfen Sie die Werte von aund bund stellen Sie sicher, dass es sich um Daten handelt.
Seth

@ Seth, du hast Recht, also habe ich meinen Kommentar gelöscht. Eines meiner "Daten" war eigentlich eine Zeichenfolge. Das funktioniert perfekt.
user3344977

14

Wenn eines oder beide Ihrer Daten in der Zukunft liegen, sind Sie leider SOL, wenn Sie eine sekundengenaue Genauigkeit wünschen. Die UTC-Zeit hat Schaltsekunden, die erst etwa 6 Monate vor ihrem Eintritt bekannt sind. Daher können weiter entfernte Daten um einige Sekunden ungenau sein (und in der Praxis, da die Benutzer ihre Maschinen nicht so oft aktualisieren, Sie kann feststellen, dass jede Zeit in der Zukunft um einige Sekunden verschoben ist).

Dies gibt eine gute Erklärung für die Theorie des Entwurfs von Datums- / Zeitbibliotheken und warum dies so ist: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 für die Erwähnung der Schaltsekundenausgabe! Es ist so frustrierend, wenn dies misshandelt wird, selbst von Leuten, die es besser wissen sollten (POSIX-Komitee, ich sehe dich an ...)
Jim Lewis

1
Erwähnenswert ist, dass der ECMA-Standard Schaltsekunden explizit ignoriert (dh sogar nach Schaltsekunden): In Zeitwerten werden Schaltsekunden ignoriert. Es wird angenommen, dass genau 86.400.000 Millisekunden pro Tag vorhanden sind .
Sylvain Leroux

11

Sie können es einfach tun.

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

Einfacher Weg:

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

Es erfordert die Installation von bc und gnu date.


1
Wie ist das relevant?
Aussteiger

-10

.Net bietet die TimeSpan-Klasse, um die Mathematik für Sie zu erledigen.

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, vielleicht möchten Sie diese Antwort löschen, damit Sie keine Punkte verlieren. Sie fragten nach JavaScript-Quellcode und nicht nach Visual Basic-Quellcode.
MacGyver
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.