2013-04-24 14 views
7

ho guardato in giro come fare questo e ho trovato molti esempi con codice complicato. Im usando questo:Calcola la differenza di tempo tra due volte javascript

var time1 = new Date(); 
var time1ms= time1.getTime(time1); //i get the time in ms 

allora faccio questo in altra parte del codice

var time2 = new Date(); 
var time2ms= time2.getTime(time2); 

e finnally:

var difference= time2ms-time1ms; 
var lapse=new Date(difference); 
label.text(lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds()); 

Questa grande opera, ad eccezione di una questione, le ore mi ha sempre dato +1, quindi devo aggiungere al codice (time.getHours() - 1) altrimenti mi ha dato un altro ora ....

Penso che sia un modo più semplice per farlo rispetto a tutti gli altri esempi in giro ... ma non riesco ancora a capire perché ho bisogno di aggiungere "-1" per avere l'intervallo corretto.

Grazie !!!

risposta

11

Il problema è il fuso orario.

Quando si esegue new Date(difference), si sta creando un oggetto Date che rappresentano il momento exatcly difference millisecondi dopo il 1 ° gennaio 1970. Quando si esegue lapse.getHours() il fuso orario è utilizzato nel calcolo. Non è possibile modificare il fuso orario tramite Javascript e non è possibile modificare questo comportamento. Non senza alcuni trucchi Javascript pesanti.

Ma il vostro difference fa non rappresentano una data, ma una differenza date. Trattare in quanto tale, e calcolare le ore, i minuti ei secondi come questo:

var hours = Math.floor(difference/36e5), 
    minutes = Math.floor(difference % 36e5/60000), 
    seconds = Math.floor(difference % 60000/1000); 

In alternativa, si può prendere il fuso orario in considerazione durante la creazione di lapse:

var lapse = new Date(difference + new Date().getTimezoneOffset() * 1000); 

ma io non consiglierei questo : Gli oggetti Date sono eccessivi per i tuoi scopi.

+0

Cosa tryin im per rappresentare è una differenza di date, userò la vostra linea 'ore var = Math.floor (differenza/36e 5) 'dal momento che non ho problemi con i minuti e i secondi ... Dovrebbe funzionare, giusto? Molte grazie! – user2314770

+0

ho usato Math.floor (differenza/36e5), e funziona, solo per curiosità cosa significa 36e5? – user2314770

+3

36e5 è il numero 3600000 - si chiama "notazione scientifica" ed è uguale a 36 * 10^5 – DThought

2

Nota che nei getTimezoneOffset() restituisce un valore in minuti, quindi se si desidera utilizzare il lasso, è possibile correggere la differenza di fuso orario in questo modo:

lapse = new Date(difference); 
tz_correction_minutes = new Date().getTimezoneOffset() - lapse.getTimezoneOffset(); 
lapse.setMinutes(offset_date.getMinutes() + tz_correction_minutes); 

ora si può fare:

label.text(lapse.getDate()-1+' days and' +lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds()); 

per stampare la differenza di tempo in forma leggibile

Problemi correlati