2013-04-24 71 views
7

我已經四處尋找如何做到這一點,我發現了很多複雜代碼的例子。使用 林這樣的:計算兩次之間的時間差javascript

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

那麼我這樣做的代碼

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

和finnally的另一部分:

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

這個偉大的工程,除了一個問題,小時它給了我總是+1,所以我必須添加到代碼(time.getHours() - 1),否則它給了我一個多小時....

我認爲比其他所有例子更容易做到這一點......但我仍然不明白爲什麼我需要添加'-1'纔能有正確的流逝。

THANKs !!!

回答

11

問題是你的時區。

當你這樣做new Date(difference),當你做你的lapse.getHours()時區在計算中使用你創建一個Date對象代表1月1日,1970年後exatcly difference毫秒的時刻。你不能通過Javascript修改你的時區,也不能修改這個行爲。不是沒有一些 Javascript技巧。

但是你difference確實代表日期,但日期的差異。治療是這樣的,並計算小時,分鐘和秒這樣的:

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

此外,在創建lapse時,你可以把你的時區到:

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

,但我不會推薦:Date對象是爲你的目的矯枉過正。

+0

什麼IM試着代表它是日期的差別,我會用你的線「變種小時= Math.floor(差/ 36E 5)'因爲我沒有問題的分鐘和秒......這應該工作,對吧?非常感謝! – user2314770 2013-04-24 10:35:56

+0

我用Math.floor(差異/ 36e5),它的工作原理,只是爲了好奇心是什麼意思36e5? – user2314770 2013-04-24 10:54:29

+3

36e5是數字3600000 - 它被稱爲「科學記數法」,等於36 * 10^5 – DThought 2013-04-24 12:17:59

2

注意的是,在getTimezoneOffset()回報分鐘的值,所以如果你想使用的推移,你可以糾正它像這樣的時區差異:

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

現在你可以這樣做:

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

打印出來的時間差在人類可讀的形式