date.setHours(-1) 的正确行为是什么?

tst*_*ner 2 javascript datetime date

我有以下代码:

var date = new Date(2010,09,09); //09.10.2010 00:00
date.setHours(-1); //sets the date to 08.10.2010 23:00
Run Code Online (Sandbox Code Playgroud)

调用date.setHours(-1);将日期设置为前一天的 23:00(至少对于 Opera 和 Chrome)。

这合法吗?

And*_*yle 6

这不仅是合法的,而且是必需的

该行为在ECMAScript 规范第 15.9.5.34 节中正式定义:

Date.prototype.setHours(小时[,分钟[,秒[,毫秒]]])

如果未指定min ,则其行为就像使用值指定mingetMinutes()一样。

如果未指定sec ,则其行为就像使用值指定secgetSeconds()一样。

如果未指定ms,则其行为就像使用值指定msgetMilliseconds()一样。

  1. t为 LocalTime(此时间值)的结果。
  2. h为 ToNumber(小时)。
  3. 如果未指定min ,则令m为 MinFromTime( t );否则,令m为 ToNumber( min )。
  4. 如果未指定sec ,则令s为 SecFromTime( t );否则,令s为 ToNumber( sec )。
  5. 如果未指定ms ,则令milli为 msFromTime( t );否则,令milli为 ToNumber( ms )。
  6. 日期为 MakeDate(Day( t ), MakeTime( h , m , s , milli ))。
  7. u为 TimeClip(UTC(日期))。
  8. 将此 Date 对象的 [[PrimitiveValue]] 内部属性设置为u
  9. 返回

以及规格MakeTime最终通过将各个部分相乘来计算出毫秒偏移量。参数的界限没有先决条件(除了它们是有限的),因此负数小时是合法的,并且会导致负结果。

因此,总体结果(即午夜 +(-1 小时))确实需要是前一天的 23:00 才能符合规范。