Ale*_*aid 7 javascript settimeout
我从堆栈溢出中获取以下代码:
function doSomething() {
var d = new Date(),
h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours() + 1, 0, 0, 0),
e = h - d;
window.setTimeout(doSomething, e);
//code to be run
alert("On the hour")
}
doSomething();
Run Code Online (Sandbox Code Playgroud)
这完美地工作,并在每小时产生一个警报.我希望该功能每隔15分钟运行一次,分别为00,15,30和45
kam*_*uel 14
通过以下方式获取下一15分钟的时间:
(d.getMinutes() - (d.getMinutes() % 15)) + 15
Run Code Online (Sandbox Code Playgroud)
例如,当您doSomething()在13:43 调用时,它将在下一次13:45运行:
( 43 - (43 % 15) + 15 ) = ( 43 - 13 + 15 ) = 45
Run Code Online (Sandbox Code Playgroud)
然后它将按预期运行:14:00,14:15等等......
完整代码:
function doSomething() {
var d = new Date(),
h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), (d.getMinutes() - (d.getMinutes() % 15)) + 15, 0, 0),
e = h - d;
window.setTimeout(doSomething, e);
console.log('run');
}
doSomething();
Run Code Online (Sandbox Code Playgroud)
这比其他人提出的要棘手一些。你不想要从现在开始的 15 分钟,你想要 15 分钟,从最近的下一个开始。有很多方法可以做到这一点,但我首先想到的是这个:
function doSomething() {
var d = new Date();
var minutes = 15 - d.getMinutes() % 15; // the number of minutes till the next 15.
window.setTimeout(doSomething, minutes * 60 * 1000);
//code to be run
alert("On the quarter-hour")
}
doSomething();
Run Code Online (Sandbox Code Playgroud)
试一试。:-)
上面的代码是最简单的,但会出现问题,因为它只查看分钟。它最多可以漂移 59.999 秒,并且取决于处理器负载,甚至可能偶尔出现在 1、16、31 或 46 上。为确保不会发生这种情况,您需要减去:
function doSomething() {
var d = new Date();
var minutes = 15 - d.getMinutes() % 15; // the number of minutes till the next 15.
var h = new Date(d.getYear(), d.getMonth(), d.getDay(), d.getHours(), d.getMinutes() + minutes, 0);
var e = h-d;
window.setTimeout(doSomething, e);
//code to be run
alert("On the quarter-hour")
}
doSomething();
Run Code Online (Sandbox Code Playgroud)
这让你精确到秒,而我原来的帖子只精确到分钟。