Date.setSeconds()传入负值为何导致时间结果不符合预期?
为什么Date.setSeconds传入负值后结果不符合预期?
先看这段在浏览器控制台执行的代码:
const d = new Date("Tue Aug 22 2023 14:33:37 GMT+0300"); // 返回undefined d // Tue Aug 22 2023 14:33:37 GMT+0300 d.setSeconds(-60); // 1692703920000 d // Tue Aug 22 2023 14:32:00 GMT+0300
执行后预期d的值是Tue Aug 22 2023 14:32:37 GMT+0300,但实际结果却是秒数归零的14:32:00,这是为什么?
MDN相关说明(翻译)
若你指定的参数超出预期范围,
setSeconds()会尝试相应更新Date对象中的日期信息。例如,若你传入100作为secondsValue,Date对象中的分钟数会增加1,秒数则设为40。
解答
你误解了setSeconds()的参数作用——这个方法的第一个参数是要设置的秒数绝对值,而不是相对于当前秒数的偏移量。
当你调用d.setSeconds(-60)时,并不是在当前秒数(37)的基础上减去60,而是直接尝试把秒数设置为-60。根据规则,超出范围的参数会触发日期自动调整:
- 1分钟=60秒,-60秒就相当于往前推1分钟,同时秒数部分归零(-60 + 60 = 0)
- 原本的14:33:37减去1分钟后变成14:32:00,秒数被修正为0,这就是你看到的结果。
如果想要实现“当前秒数减去60秒”的效果,应该先获取当前秒数再计算:
d.setSeconds(d.getSeconds() - 60);
这样执行后,d就会变成你预期的Tue Aug 22 2023 14:32:37 GMT+0300。
内容的提问来源于stack exchange,提问作者user8555937
相关产品推荐
相关产品推荐

