関数が何をしているかを見てください。h
現在時刻の 1 時間後に変数が設定されています。
//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)
この新たに発見された知識を使用して、現在の時間に 1 を追加する代わりに、現在の時間に 15 分を追加する必要があると推測できます。問題は、やみくもに 15 分を追加して、準備が整ったと考えることはできないということです。実際には、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です