我有以下代码:
var date = new Date(2010,09,09); //09.10.2010 00:00
date.setHours(-1); //sets the date to 08.10.2010 23:00
调用date.setHours(-1);
将日期设置为前一天的 23:00(至少对于 Opera 和 Chrome)。
这合法吗?
我有以下代码:
var date = new Date(2010,09,09); //09.10.2010 00:00
date.setHours(-1); //sets the date to 08.10.2010 23:00
调用date.setHours(-1);
将日期设置为前一天的 23:00(至少对于 Opera 和 Chrome)。
这合法吗?
它不仅合法,而且是必需的。
该行为在ECMAScript 规范15.9.5.34 节中正式定义:
Date.prototype.setHours (小时 [, min [, sec [, ms ] ] ] )
如果未指定min,则其行为就像使用 value 指定了min
getMinutes()
一样。如果未指定sec,则其行为就像使用 value 指定了sec
getSeconds()
一样。如果未指定ms,则其行为就像使用 value 指定ms
getMilliseconds()
一样。
- 令t为 LocalTime(此时间值)的结果。
- 设h为 ToNumber(小时)。
- 如果未指定min,则令m为 MinFromTime( t );否则,令m为 ToNumber( min )。
- 如果未指定sec,则令s为 SecFromTime( t );否则,设s为 ToNumber( sec )。
- 如果未指定ms,则让milli为 msFromTime( t );否则,设milli为ToNumber( ms )。
- 设日期为 MakeDate(Day( t ), MakeTime( h , m , s , milli ))。
- 让你成为 TimeClip(UTC(日期))。
- 将此 Date 对象的 [[PrimitiveValue]] 内部属性设置为u。
- 还你
并且在步骤 6 中使用的规范MakeTime
最终通过将各个部分相乘来计算毫秒偏移量。参数的边界没有先决条件(除了它们是有限的),因此负数小时是合法的,并且会导致负数结果。
因此,总体结果,即午夜 +(-1 小时),确实需要是前一天的 23:00 才能符合规范。
是的,这实际上是规范所规定的,所以如果没有,这将是一个“非法”的实现。
实际计算发生在MakeDate
. 日期转换为毫秒,-1 小时也是如此。然后添加这些。添加负数会做减法,因此您会得到更早的日期。
如果
day
不是有限的或time
不是有限的,则返回NaN
。返回
day
×msPerDay
+time
。
向律师寻求合法性。但你可能想做:
date.setHours(date.getHours()-1);
把它做好 - 正如你所期望的那样。
也许值得一提的是,setDate(-1)
不要按照你期望的方式工作。setMonth(-1)
setYear(-1)