2013-08-02 18 views
6

İki ISO zaman damgasını karşılaştırmamı ve sonra aralarındaki farkı yazmam için bana izin verecek JavaScript yazmam gerekiyor, örneğin: "32 saniye".Karşılaştırın 2 ISO 8601 zaman damgası ve çıkış saniye/dakika farkı

Yığın Taşması'nda bulduğum bir işlev, normal bir tarihi ISO formatlı bir sıraya dönüştürür. Yani, bu ilk çıkış yolu, şu anki zamanı ISO formatında alma.

Yapmam gereken bir sonraki şey, onu karşılaştırmak için başka bir ISO zaman damgası almasıdır, bir nesnede saklıyorum. Bu gibi erişilebilir: marker.timestamp (aşağıdaki kodda gösterildiği gibi). Şimdi bu iki iki zaman damgasını karşılaştırmalı ve aralarındaki farkı bulmalıyım. < 60 saniyeyse, saniyeler içinde çıkmalıdır, eğer> 60 saniyeyse, örneğin 1 dakika ve 12 saniye önce çıkmalıdır.

Teşekkürler!

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

Bu nedenle, currentISODateTime'ı "ISODateTimeToCompareWith" ile karşılaştırmak ve ISO 8601 biçiminde mi? – federicot

+0

@Campari Evet, tam olarak o zaman, aralarındaki farkı verin. Her ikisi de ISO 8601 biçimindedir. – jskidd3

cevap

17

Yani basit

olarak
var differenceInMs = dateNewer - dateOlder; 

olduğunu geri damgaları dönüştürmek: Sadece tarihi sınıfla çok basit mantığı kullanabilirsiniz Bu şekilde iki ISODates arasındaki farkı belirlemek için Tarih örnekleri

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 

farkını alın

var diff = d2 - d1; 

Biçim bu böyle, her iki zaman damgaları gelen süreyi saniye olarak elde öneriyoruz

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

Teşekkürler. 'E3' bitleri sayılardan sonra ne anlama geliyor? – jskidd3

+4

Oh Görüyorum, bunu 60k için sadece bir kısaydı. : P – jskidd3

1

Tarih nesnesini, ISODate sınıfınızın bir parçası olarak depolarım. Görüntülemeniz gerektiğinde dize dönüştürmeyi yalnızca toString yöntemiyle yapabilirsiniz. ,

iki tarihleri ​​karşılaştırılması
var difference = ISODate.date - ISODateToCompare.date; 
if (difference > 60000) { 
    // display minutes and seconds 
} else { 
    // display seconds 
} 
1

olarak istenen: o zaman

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

Ve difference ile çalışıyor. Örneğin:

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

Önemli: Daha önce olduğu bakılmaksızın, aralarındaki mutlak farkı elde etmek saniyede tarihleri ​​karşılaştırmak için Math.abs kullandı.

+0

Saniye cinsinden değeri elde etmek için 1000 ile çarpmak yerine '(yeni Tarih (ISO)) .Time()' yi 1000 olarak bölmeniz gerektiğini buldum. – eskimwier

İlgili konular