2010-11-05 177 views
7

我在我的應用程序中有一段簡單的Javascript,它有一個鏈接「添加日期」,它將日期添加到一天。它始終完美運行,除非日期爲2010年7月11日,然後鏈接突然不再起作用。它真的很奇怪,因爲它只會在11/07/2010的特定日期掛起。Javascript日期,這是我的錯誤還是我發現了一個錯誤?

如何重現錯誤:

  1. 瀏覽網頁here
  2. 在任意日期字段,單擊「今天」,或者只是設置日期到今天。
  3. 點擊「添加日」直到你到達11/07/2010
  4. 現在點擊「添加日」不再有效!
+0

不爲我在Chrome。似乎工作正常。 – harpo 2010-11-05 20:13:48

+1

適用於我(FF 3.6.12)。什麼瀏覽器? – 2010-11-05 20:14:18

+0

適合我。你使用的是什麼瀏覽器?你是否可能被夏時制計算錯誤所困擾? – 2010-11-05 20:15:59

回答

13

問題是,您將24小時添加到日期以添加一天;夏令時阻礙了您,因爲11月7日00:00之後的24小時將於11月7日23:00(第二次)。

+0

而且,當然,這種行爲將取決於夏令時是否在您的瀏覽器正在運行的語言環境中於11月7日結束。 – 2010-11-05 20:17:28

+1

好的。我在AZ - 我們在這裏沒有DST :) – 2010-11-05 20:19:20

+0

+1因爲我輸入緩慢:\ – Angiosperm 2010-11-05 20:23:37

1

夏令時。 (在美國大部分地區),時間在11月的第一個星期日回滾。您的代碼只需在輸入框指定的一天的開始處添加毫秒量,然後返回結果日的開始日期:但由於DST原因,只需添加秒並以這種方式截斷日期就不會進行日期。

3

其他人發現了問題所在。

要解決它,你可以使用重載Date構造函數的年,月,日:

var aDate = new Date(2010, 10, 07); 
var aDatePlusOneDay = new Date(aDate.getFullYear(), 
           aDate.getMonth(), 
           aDate.getDate() + 1, // HERE 
           aDate.getHours(), 
           aDate.getMinutes(), 
           aDate.getSeconds(), 
           aDate.getMilliseconds()); 

這裏有一個更通用的解決方案,可以增加一個給定毫秒量的任何日期,以改變夏令考慮:

Date.addTicks = function(date, ticks) { 
    var newDate = new Date(date.getTime() + ticks); 
    var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset(); 
    return new Date(newDate.getTime() + tzOffsetDelta * 60000); 
} 

添加天到Date對象然後是加入在一天的毫秒數的問題:

Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8) 

參考文獻:

相關問題