2013-04-24 22 views
7

Ich habe mich um, wie dies zu tun, und ich fand viele Beispiele mit komplizierten Code. Im mit dieser:Berechnen Zeitunterschied zwischen zwei mal Javascript

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

dann tue ich dies in einem anderen Teil des Codes

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

und finnally:

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

Dies funktioniert gut, außer für ein Problem, die Stunden es gaves mir sind immer +1 so muss ich hinzufügen, um den Code (time.getHours() - 1) sonst gaves mir eine Stunde mehr ....

Ich denke, es ist ein einfacherer Weg, es zu tun als all die anderen Beispiele um ... aber ich verstehe immer noch nicht, warum ich '-1' hinzufügen muss, um den richtigen Fehler zu haben.

Dank !!!

Antwort

11

Das Problem ist Ihre Zeitzone.

Wenn Sie das tun new Date(difference), erstellen Sie ein Date Objekt, das den Moment exatcly difference Millisekunden nach dem 1. Januar vertreten, 1970. Wenn Sie das tun lapse.getHours() Ihre Zeitzone in der Berechnung verwendet wird. Sie können Ihre Zeitzone nicht über Javascript ändern und dieses Verhalten nicht ändern. Nicht ohne einige schwere Javascript-Tricks.

Aber Ihr difference tut nicht ein Datum darstellen, sondern ein Unterschied von Terminen. Treat ist als solche, und berechnen Sie die Stunden, Minuten und Sekunden wie folgt aus:

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

Alternativ können Sie Ihre Zeitzone berücksichtigen kann, wenn lapse erstellen:

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

aber ich würde nicht empfehlen : Date Objekte sind Overkill für Ihre Zwecke.

+0

Was im tryin darzustellen es eine Differenz von Terminen ist, werde ich Ihre Linie ‚var Stunden = Math.floor (Differenz/36e verwenden 5) 'da ich keine Probleme mit den Minuten und Sekunden habe ... Das sollte funktionieren, oder? Danke vielmals! – user2314770

+0

ich benutzte Math.floor (Differenz/36e5), und es funktioniert, nur aus Neugier was bedeutet es 36e5? – user2314770

+3

36e5 ist die Nummer 3600000 - es heißt "wissenschaftliche Notation" und entspricht 36 * 10^5 – DThought

2

Beachten Sie, dass in den getTimezoneOffset() liefert einen Wert in Minuten, wenn Sie also das Verstreichen verwenden möchten, können Sie es für die Zeitzone Unterschied wie folgt korrigieren:

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

jetzt können Sie tun:

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

aus der Zeitdifferenz in für Menschen lesbare Form drucken

Verwandte Themen