我从堆栈溢出中获取以下代码:
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();
这完美无缺,并且每小时都会发出警报。 我希望该函数每隔15分钟运行一次,分别为00,15,30和45
答案 0 :(得分:13)
获取下一个偶数15
分钟的时间:
(d.getMinutes() - (d.getMinutes() % 15)) + 15
例如,当您在13:43调用doSomething()
时,它将在下次13:45运行:
( 43 - (43 % 15) + 15 ) = ( 43 - 13 + 15 ) = 45
然后它将按预期运行: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();
答案 1 :(得分:4)
看看这个功能在做什么。您将变量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
答案 2 :(得分:3)
这比其他人提出的要复杂一点。你不想要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();
试一试。 : - )
上面的代码是最简单的,但是会有问题,因为它只查看分钟。它可以漂移最多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();
这使你精确到秒,而我的原始帖子只是精确到分钟。
答案 3 :(得分:-1)
function doSomething() {
var d = new Date(),
current_minutes = d.getMinutes(),
current_hour = d.getHours(),
next_min_hit = 0;
if ( current_minutes >= 0 && current_minutes < 15 )
next_min_hit = 15;
if ( current_minutes >= 15 && current_minutes < 30 )
next_min_hit = 30;
if ( current_minutes >= 30 && current_minutes < 45 )
next_min_hit = 45;
if ( current_minutes >= 45 && current_minutes < 59 ){
next_min_hit = 0;
current_hour++;
}
var h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), current_hour, next_min_hit , 0, 0),
e = h - d;
window.setTimeout(doSomething, e);
//code to be run
alert("On the hour")
}
doSomething();