您可以通过每次清除和设置间隔来做到这一点。这只是第一次,而不是间隔是一小时,而是一小时减去当前的分钟和秒:
var d = new Date();
var secondsPastHour = d.getMinutes()*60 + d.getSeconds();
var intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 );
function myFn() {
// do stuff
// ...
clearInterval( intervalId );
intervalId = setInterval( myFn, 60*60*1000 );
}
唯一的问题是它最终可能会开始漂移......解决方案就是在函数内部做同样的事情,就像你在启动它时所做的那样:
var d = new Date();
var secondsPastHour = d.getMinutes()*60 + d.getSeconds();
var intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 );
function myFn() {
// do stuff
// ...
clearInterval( intervalId );
var d = new Date();
var secondsPastHour = d.getMinutes()*60 + d.getSeconds();
intervalId = setInterval( myFn, 60*60*1000 - secondsPastHour*1000 );
}
这是每分钟更新一次的概念证明(我不想等一小时来测试我的代码!):http: //jsfiddle.net/dRsua/