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

What is the correct behaviour for date.setHours(-1)?

本文关键字:是什么 setHours date      更新时间:2023-09-26

我有以下代码:

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 节中正式定义:

日期.原型.设置小时 (小时 [, 分钟 [, 秒 [, 毫秒 ] ] ] )

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

如果未指定 sec

,则其行为就像使用值 getSeconds() 指定 sec 一样。

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

  1. t 是本地时间的结果(此时间值)。
  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(hmsmilli))。
  7. 让我们成为TimeClip(UTC(date))。
  8. 将此 Date 对象的 [[PrimitiveValue]] 内部属性设置为 u
  9. 返回 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)并没有按照你期望的方式工作。