【问题标题】:FireFox 34 setMinutes BUG?FireFox 34 setMinutes BUG?
【发布时间】:2026-02-14 13:10:01
【问题描述】:

FireFox 34 setMinutes 日期方法有一个奇怪的行为,将 60 分钟设置为 2008 年 1 月 1 日 23 时 00 分 00 秒。预计天数会增加,但事实并非如此。

var initDate = [2008, 0, 1];
var d = new Date(initDate[0], initDate[1], initDate[2]);
document.body.innerHTML += d + "<br/>";
d.setHours(23);
d.setMinutes(60);
document.body.innerHTML += d + "<br/>";

FireFox 34 结果是:

Tue Jan 01 2008 00:00:00 GMT+0300 (Russia TZ 2 Standard Time) 
Tue Jan 01 2008 23:00:00 GMT+0300 (Russia TZ 2 Standard Time)

而不是 Chrome 39.0.2171.71 m:

Tue Jan 01 2008 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)
Wed Jan 02 2008 01:00:00 GMT+0400 (Russia TZ 2 Daylight Time)

如果我将年份更改为 2006 年,结果是可以的:

Sun Jan 01 2006 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)
Mon Jan 02 2006 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)

http://jsfiddle.net/7dp8xvf8/1/

这是一个错误吗?

更新: IE 8 和 9 具有相同的行为,但 10-11 没问题。

【问题讨论】:

  • 很明显,Chrome 改变了时区,而 FireFox 没有;我假设您自己也在那个位置,当时有什么重大变化吗?在那个日期前后,我无法在网上找到任何东西。
  • 如果您的setMinutes 小于60,您会看到什么行为? (例如,d.setMinutes(58); 会产生什么?)如果不更改浏览器的时区/位置,我认为我无法测试您的脚本。
  • @AdrianWragg 我在那个位置,但在上次 FireFox 更新之前,问题还没有出现。
  • @apsillers 结果:“Sun Jan 01 2006 23:58:00 GMT+0300 (Russia TZ 2 Standard Time)”
  • @Haketo,ES 5.1 spec 同意 El Gans,6.0 draft 也是如此。这可能确实是 Firefox 34 中的一个错误。

标签: javascript date firefox time


【解决方案1】:

鉴于specification,我相信这确实是预期的行为。特别要注意MakeTime function 不包含溢出检查(即,它不能确定分钟数是否小于 60)。 MakeDate 函数的行为类似;因此,Firefox 实际上正确地遵循了规范。

【讨论】:

  • 不,规范通过基本上将各个组件相加来计算自第 0 天以来的毫秒数。因此,将分钟设置为 60 应该会更改小时。
【解决方案2】:

这在 Firefox 39.0.3 以及当前的开发版本 (42a) 中符合我的预期:

"Tue Jan 01 2008 00:00:00 GMT+0300 (MSK)"
"Wed Jan 02 2008 00:00:00 GMT+0300 (MSK)"

这也是 ES 规范所要求的。

如果这仍然对您不起作用(这将是令人惊讶的),尤其是如果您看到与时区相关的怪异现象,您还应该提及您的系统 TZ 设置。

【讨论】: