2011-09-10 68 views
1

兩個日期之間的差異,當我用以下方法來計算在JavaScript中兩個日期之間的區別:時區計算的問題在JavaScript

var dateOne = new Date; // Now 
var dateTwo = new Date(dateOne.getTime() + 60 * 1000); // Now + One Minute 
var difference = new Date(dateTwo - dateOne); 

所以,從邏輯上講,difference應該是一分鐘。但Firebug告訴我,差異是一個小時,時區也會改變!

dateOne = Date {Sun Sep 11 2011 01:07:55 GMT+0200 (CET)} 
dateTwo = Date {Sun Sep 11 2011 01:08:55 GMT+0200 (CET)} 
difference = Date {Thu Jan 01 1970 01:01:00 GMT+0100 (CET)} 

我該如何解決這個問題?

+0

你已經擁有的時差:它是'60000'。 – user278064

+0

@ user278064你有沒有聽過「提供例子」這個詞? – sjngm

回答

4

Date是專爲存儲確切的日期和時間,而不是日期和時間之間的差異。減去那些Date對象會產生這兩個日期之間的毫秒數。然後,您創建一個新的Date自Epoch以來的毫秒數。自1970年1月1日午夜開始,結果將是1970年1月1日上午12:01。夏令時會稍稍改變時區。

2

在JavaScript中,所有時間均爲GMT。每次將Date轉換爲字符串時,時區都會「應用於」輸出。所以,你可以嘗試讓以毫秒爲單位的區別:

difference = dateTwo.getTime() - dateOne.getTime() 

,自從你加入這顯然是60000。

沒有TimeSpan類或其他東西。日期只存儲日期。

編輯:
如果你想知道爲什麼產生+2:00小時,然後只是+1:00,這是因爲1月1日是在標準時間,而9月11日有夏令時。這不是因爲JavaScript從另一個日期扣除某個日期時會做些有趣的事情。

+0

感謝您提供時區信息 - 我忘記了1970年1月是冬季時間。 – anroesti

1

以前的答案是,以澄清問題的原因很不錯,但我認爲這也是情理之中的指出,JavaScript有兩個「本地時區」和「UTC」的方法: -

var dtnow = new Date(); 
var val1 = dtnow.getHours(); 
var val2 = dtnow.getUTCHours(); 

。 ..如果運行該代碼的機器具有除GMT以外的本地時區(可能是英國夏令時,即GMT + 01:00),則返回值可能與不同(取決於您設置的日期值以及是否JS引擎不會從非UTC方法返回GMT - 我已經看到了不同之處,例如在Rhino中就有區別)。

因此,爲了計算的目的,您可能希望使用UTC方法提取所有值,從而確保一切都基於GMT。這會使數學「技術上正確」,但是對於給定目的而言,這在語義上是否正確取決於用例。

例如,美國凌晨2點與英國凌晨2點比較,忽略時區,則爲0.而時區則可能爲6(例如)。我有時也會爲此而苦苦掙扎,而且在我遵循一條或另一條路線之前,我經常不得不認真思考自己想要達到的目標!始終烤給我的麪條一會兒:-)

0

可以計算兩個日期由下式跨越休息先令之間的充分證明天差:

var start = new Date('10/3/2015'); 
 
      var end = new Date('11/2/2015'); 
 
      var days = (end - start)/1000/60/60/24; 
 
console.log(days); 
 
      // actually its 30 ; but due to daylight savings will show 31.0xxx 
 
      // which you need to offset as below 
 
      days = days - (end.getTimezoneOffset() - start.getTimezoneOffset())/(60 * 24); 
 
console.log(days);