date.setHours(-1) 的正确行为是什么
What is the correct behaviour for date.setHours(-1)?
我有以下代码:
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,则其行为就像使用值
如果未指定 secgetMinutes()
指定 min 一样。,则其行为就像使用值
getSeconds()
指定 sec 一样。如果未指定 ms,则其行为就像使用值
getMilliseconds()
指定 ms 一样。
- 让 t 是本地时间的结果(此时间值)。
- 设 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))。
- 将此 Date 对象的 [[PrimitiveValue]] 内部属性设置为 u。
- 返回 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)
并没有按照你期望的方式工作。
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- date.setHours(-1) 的正确行为是什么