Ile sekund dzieli dwie daty?


180

Więc mam dwie daty YYYY-MM-DDiZZZZ-NN-EE

Jak mogę sprawdzić, ile sekund zostało między nimi?


173
Staram się zostawiać co najmniej pół godziny między randkami, żeby nie dać się złapać.
Don Branson,

yyyy-MM-ddjest jasne (rok, miesiąc, dzień - zwróć uwagę, że nie wszystkie są pisane wielkimi literami), ale ZZZZ-NN-EE nie. Interpretuję to jako (strefa czasowa, ???, dzień w tygodniu). Czy to tydzień w roku? Jeśli tak, to byłoby ww. Ale nadal potrzebujemy również roku, aby obliczyć różnicę. Czy możesz podać rzeczywiste wartości przykładowe?
BalusC,

7
@BalusC: Myślę, że przeszedł do następnych liter, aby wskazać drugą datę (Y -> Z, M -> N i D -> E). Używanie nazw zmiennych, takich jak startDate i endDate, byłoby prawdopodobnie lepsze.
Austin Salonen

O, rozumiem. To rzeczywiście można było prosić o wiele jaśniej.
BalusC,

Odpowiedzi:


242

Biorę RRRR i ZZZZ, aby oznaczać wartości całkowite, które oznaczają rok, MM i NN, aby oznaczać wartości całkowite oznaczające miesiąc w roku, a DD i EE jako wartości całkowite, które oznaczają dzień miesiąca.

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

Poręcznym źródłem do wykorzystania w przyszłości jest plik witryna MDN

Alternatywnie, jeśli twoje daty są w formacie javascript może przeanalizować

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

a następnie możesz użyć tej wartości jako różnicy w milisekundach (wartość dif w obu moich przykładach ma to samo znaczenie)


1
Tylko wzorce użyte w przykładzie nie są takie prawidłowe. 4-cyfrowe lata zapisuje się małymi literami yyyy, 2-cyfrowe miesiące dużymi literami, MMa 2-cyfrowe dni małymi literami dd.
BalusC,

1
Martin, mam wrażenie, że nie używałem tutaj żadnych wzorców dat. MM DD, RRRR i NN EE, ZZZZ to w rzeczywistości „wartości przykładowe”, o które zapytał Steven. Innymi słowy, nie zajmuje się formatowaniem.
Wagner Silveira,

Zaktualizowałem drugi przykład i wydaje mi się, że wszyscy byli zdezorientowani. Dodałem też trochę wyjaśnienia, jak dokładnie interpretuję wartości podane w jego przykładzie.
Martin

Twoja druga zmienna musi zostać wywołana t2.
Kees C. Bakker

W większości przypadków będziesz prawdopodobnie wykonywał t2 - t1, a nie t1 - t2
UpTheCreek

83

Po prostu odejmij:

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 - wtedy dzieje się coś śmiesznego! Sprawdź wartości ai bi upewnij się, że są to daty.
Seth

@ Wydaje mi się, że masz rację, więc usunąłem swój komentarz ... jedna z moich „dat” była w rzeczywistości ciągiem. To działa doskonale.
user3344977

14

Jeśli jedna lub obie twoje daty są w przyszłości, to obawiam się, że jesteś SOL, jeśli chcesz dokładność co do sekundy. Czas UTC ma sekundy przestępne, które nie są znane do około 6 miesięcy przed ich wystąpieniem, więc jakiekolwiek dalsze daty mogą być niedokładne o pewną liczbę sekund (iw praktyce, ponieważ ludzie nie aktualizują swoich maszyn tak często, może się okazać, że w przyszłości nastąpi odstęp o kilka sekund).

Daje to dobre wyjaśnienie teorii projektowania bibliotek daty / czasu i dlaczego tak jest: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 za wzmiankę o drugim problemie! To takie frustrujące, kiedy się z tym źle obchodzą, nawet przez ludzi, którzy powinni wiedzieć lepiej (komisja POSIX, patrzę na ciebie ...)
Jim Lewis.

1
Warto wspomnieć, że standard ECMA wyraźnie ignoruje sekundy przestępne (tj. Nawet przeszłe sekundy przestępne): W wartościach czasu sekundy przestępne są ignorowane. Przyjmuje się, że dziennie jest dokładnie 86 400 000 milisekund .
Sylvain Leroux,

11

Możesz to zrobić po prostu.

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

Łatwy sposób:

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

W bash:

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

Wymaga zainstalowania daty bc i gnu.


1
Jakie to ma znaczenie?
Rezygnacja

-10

.Net udostępnia klasę TimeSpan, która wykonuje obliczenia za Ciebie.

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, możesz usunąć tę odpowiedź, aby nie stracić punktów. Poprosili o kod źródłowy JavaScript zamiast kodu źródłowego Visual Basic.
MacGyver
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.