2010-11-05 68 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) 

参考文献:

相关问题