javascript每隔一小时在00,15,30,45运行一个函数

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)

  • @IdanHen`new Date()`如果你传递大于59的分钟值,它将会处理它 (3认同)
  • 如果它在46分钟内你会遇到问题......不是吗? (2认同)

Sco*_*ica 5

这比其他人提出的要棘手一些。你不想要从现在开始的 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)

这让你精确到秒,而我原来的帖子只精确到分钟。