2013-08-02 12 views
6

Ho bisogno di scrivere JavaScript che mi consenta di confrontare due timestamp ISO e quindi stampare la differenza tra loro, ad esempio: "32 secondi".Confronta 2 ISO 8601 timestamp e output secondi/minuti di differenza

Di seguito è una funzione che ho trovato su Stack Overflow, trasforma una data ordinaria in una formattata ISO. Quindi, questa è la prima cosa da fare, ottenere l'ora corrente nel formato ISO.

La prossima cosa che devo fare è ottenere un altro timestamp ISO per confrontarlo, beh, ho quello memorizzato in un oggetto. Si può accedere in questo modo: marker.timestamp (come mostrato nel codice qui sotto). Ora ho bisogno di confrontare quei due due timestamp e calcolare la differenza tra loro. Se è < 60 secondi, dovrebbe produrre in pochi secondi, se è> 60 secondi, dovrebbe produrre 1 minuto e 12 secondi fa, per esempio.

Grazie!

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

Quindi si desidera confrontare 'currentISODateTime' con' ISODateTimeToCompareWith' e sono entrambi in formato ISO 8601? – federicot

+0

@Campari Sì, esattamente quello, quindi emette la differenza tra loro. Sono entrambi in formato ISO 8601. – jskidd3

risposta

17

Confrontando due date è semplice come

var differenceInMs = dateNewer - dateOlder; 

Quindi, convertire i timestamp di nuovo in Data casi

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 

Prendi la differenza

var diff = d2 - d1; 

Format questo come desiderato

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

Grazie. Cosa significa il bit "e3" dopo i numeri? – jskidd3

+4

Oh capisco, immagino sia solo una scorciatoia per 60k. : P – jskidd3

1

vorrei solo memorizzare l'oggetto Date come parte della vostra classe isodate. Puoi semplicemente eseguire la conversione della stringa quando devi visualizzarla, ad esempio in un metodo toString. In questo modo si può semplicemente usare la logica molto semplice con la classe Date per determinare la differenza tra due ISODates:

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

mi consiglia di ottenere il tempo in secondi da entrambi i timestamp, come questo:

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

E poi lavorare con il difference. Per esempio:

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

Importante: ho usato Math.abs per confrontare le date in secondi per ottenere la differenza assoluta tra di loro, indipendentemente da quale sia anteriore.

+0

Ho scoperto che dovresti dividere il '(new Date (ISO)). GetTime()' per 1000 invece di moltiplicare per 1000 per ottenere il valore in secondi. – eskimwier

Problemi correlati