看看函数在做什么。您有一个变量h
设置为当前时间后一小时。
//Gets the current date
var d = new Date()
//Note the +1
h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours() + 1, 0, 0, 0)
构造函数中的每个参数Date
对应一个时间间隔
new Date(year, month, day, hours, minutes, milliseconds)
使用这一新发现的知识,我们可以推断出,我们需要在当前时间上增加 15 分钟,而不是在当前时间上加一。问题是我们不能盲目地添加 15 分钟并认为我们已经准备就绪,因为我们真正想要的是在一刻钟间隔开始,然后只在下一刻钟再次执行。
为了解决这个难题,我们必须找出距离下一个季度间隔有多远,并将其设置为我们的超时值。
var d = new Date();
var currentSeconds = d.getMinutes() * 60 + d.getSeconds();
var secondsFromQuarter = 900 - currentSeconds % 900;
现在我们知道调用 需要等待多少秒doSomething
,但我们必须将其转换为毫秒。
var millisecondsFromQuarter = minutesFromQuarter * 1000;
瞧!从这里我们可以像上面一样使用我们的millisecondsFromQuarter
值调用 setTimeout:
window.setTimeout(doSomething, millisecondsFromQuarter);
免责声明
这将精确到秒。如果需要精确到毫秒,那么您只需像这样比较毫秒值:
var currentMilliseconds = d.getMinutes() * 60 * 1000 + d.getSeconds() * 1000 + d.getMilliseconds();
var MillisecondsFromQuarter = 900000 - currentSeconds % 900000;
免责声明 #2
我对@kamituel 的回答投了赞成票,因为它在视觉上以更清晰的方式有效地做同样的事情。我不确定哪个对性能更好,但可能是 6:6