5

特定の日時に関数を実行するにはどうすればよいですか?

例: 毎月 12 日の午前 10 時に実行する必要がある関数があります。

これが重要な場合、このページは 24 時間年中無休で実行されます。

明らかに、現在の日付と比較する必要がありますが、現在の日付と時刻が一致しているかどうかを確認する方法がわかりません。

シャノン

4

5 に答える 5

16

非決定論的な動作があるため、使用することはお勧めしませんsetInterval。イベントが見逃されたり、一度にすべて発生したりする可能性があります。時間もずれます。

以下のコードでは代わりに1 分setTimeout間を使用しており、 1 分ごとにタイマーが再同期され、できるだけ hh:mm:00.000s ポイントに近づくようになっています。

function surprise(cb) {
    (function loop() {
        var now = new Date();
        if (now.getDate() === 12 && now.getHours() === 12 && now.getMinutes() === 0) {
            cb();
        }
        now = new Date();                  // allow for time passing
        var delay = 60000 - (now % 60000); // exact ms to next minute interval
        setTimeout(loop, delay);
    })();
}
于 2013-09-30T08:00:44.677 に答える
3

2 つの Date オブジェクトをインスタンス化できます。1 つは今のところ、もう 1 つはイベントの次のインスタンス用です。今は簡単です: new Date(). 次のインスタンスでは、現在よりも大きなオプションが見つかるまで、オプションをループできます。または、より洗練された日時の魔法を行います。両方の getTime() を比較し、アラートに対して setTimeout を実行します。

編集: @Alnitak がタイムアウトに最大値があることを指摘したため更新されました。遅延が 2147483648 ミリ秒を超えた場合は setTimeout がすぐに起動することを参照してください。

function scheduleMessage() {
    var today=new Date()

    //compute the date you wish to show the message
    var christmas=new Date(today.getFullYear(), 11, 25)
    if (today.getMonth()==11 && today.getDate()>25)
        christmas.setFullYear(christmas.getFullYear()+1)

    var timeout = christmas.getTime()-today.getTime();
    if( timeout > 2147483647 ){
        window.setTimeout( scheduleMessage(), 2147483647 )
    } else {
        window.setTimeout(function() {alert('Ho Ho Ho!'); scheduleMessage()}, timeout)
    }
}
于 2013-09-30T06:59:33.290 に答える
2

このようなものを使用できます

var runned = false;
var d = new Date();
if(d.getDate() == 12 && d.getHours() == 10 && !runned){
    //Do some magic
    runned = true;
}

1 時間全体ではなく、1 分単位のものが必要な場合は、d.getMinutes() を追加できます。

于 2013-09-30T07:03:15.323 に答える
-4

たぶん使用しiframe、メタリフレッシュとワークアウトコンテンツサーバー側で

<meta http-equiv="refresh" content="{CHANGE_THIS_TO_WHAT_YOU_CALCULATED_AT_SERVER}">

またはjavascripts setIntervalを使用する

var interval = 300000; // run in 5 minutes
window.setInterval("reloadRefresh();", interval);

function reloadRefresh() {
 // do whatever
}

于 2013-09-30T07:08:21.047 に答える