2013-08-02 3 views
6

Potrzebuję napisać JavaScript, który pozwoli mi porównać dwa znaczniki czasu ISO, a następnie wydrukować różnicę między nimi, na przykład: "32 sekundy".Porównaj 2 znaczniki czasu ISO 8601 i wyjściowa różnica sekund/minut

Poniżej znajduje się funkcja znaleziona w przepełnieniu stosu, zamienia zwykłą datę na formatowaną ISO. Tak, to pierwsza rzecz na drodze, uzyskanie aktualnego czasu w formacie ISO.

Następną rzeczą, którą muszę zrobić, to uzyskać kolejny znacznik czasu ISO, aby porównać go z ... no cóż, mam to zapisane w obiekcie. Dostęp do niego jest następujący: marker.timestamp (jak pokazano w poniższym kodzie). Teraz muszę porównać te dwa dwa znaczniki czasu i wyliczyć różnicę między nimi. Jeśli jest to < 60 sekund, powinno wyjść w sekundach, jeśli jest> 60 sekund, powinno to na przykład wyjść 1 minuta i 12 sekund temu.

Dzięki!

function ISODateString(d){ 
function pad(n){return n<10 ? '0'+n : n} 
return d.getUTCFullYear()+'-' 
     + pad(d.getUTCMonth()+1)+'-' 
     + pad(d.getUTCDate())+'T' 
     + pad(d.getUTCHours())+':' 
     + pad(d.getUTCMinutes())+':' 
     + pad(d.getUTCSeconds())+'Z'} 

var date = new Date(); 
var currentISODateTime = ISODateString(date); 
var ISODateTimeToCompareWith = marker.timestamp; 

// Now how do I compare them? 
+0

Więc chcesz porównać 'currentISODateTime' z' ISODateTimeToCompareWith' i oba są w formacie ISO 8601? – federicot

+0

@Campari Tak, dokładnie to, a następnie wyprowadzić różnicę między nimi. Oba są w formacie ISO 8601. – jskidd3

Odpowiedz

17

Porównywanie dwóch dat jest tak proste jak

var differenceInMs = dateNewer - dateOlder; 

więc konwertować timestampów powrotem do Data przypadki

var d1 = new Date('2013-08-02T10:09:08Z'), // 10:09 to 
    d2 = new Date('2013-08-02T10:20:08Z'); // 10:20 is 11 mins 

Get różnicę

var diff = d2 - d1; 

Format to jako pożądany

if (diff > 60e3) console.log(
    Math.floor(diff/60e3), 'minutes ago' 
); 
else console.log(
    Math.floor(diff/1e3), 'seconds ago' 
); 
// 11 minutes ago 
+0

Dzięki. Co oznacza bit "e3" po liczbach? – jskidd3

+4

Och, widzę, rozumiem, że to był skrót do 60k. : P – jskidd3

1

Po prostu przechowywałbym obiekt Date jako część Twojej klasy ISODate. Możesz po prostu wykonać konwersję ciągów, gdy chcesz ją wyświetlić, powiedzmy w metodzie toString. W ten sposób można po prostu użyć bardzo prostą logikę z klasy Date określić różnicę między dwoma ISODates:

var difference = ISODate.date - ISODateToCompare.date; 
if (difference > 60000) { 
    // display minutes and seconds 
} else { 
    // display seconds 
} 
1

Polecam się czas w sekundach od obu znaczników czasu, tak:

var firstDate = new Date(currentISODateTime), 
    secondDate = new Date(ISODateTimeToCompareWith), 
    firstDateInSeconds = firstDate.getTime() * 1000, 
    secondDateInSeconds = secondDate.getTime() * 1000, 
    difference = Math.abs(firstDateInSeconds - secondDateInSeconds); 

A potem pracuje z difference. Na przykład:

if (difference < 60) { 
    alert(difference + ' seconds'); 
} else if (difference < 3600) { 
    alert(Math.floor(difference/60) + ' minutes'); 
} else { 
    alert(Math.floor(difference/3600) + ' hours'); 
} 

Ważne: Kiedyś Math.abs porównać daty sekund, aby uzyskać bezwzględną różnicę między nimi, które niezależnie od wcześniej.

+0

Znalazłem, że powinieneś podzielić '' (new Date (ISO)). GetTime() 'o 1000 zamiast pomnożyć przez 1000, aby osiągnąć wartość w sekundach. – eskimwier