5

如何在给定的时间和日期运行函数?

示例:我有一个函数需要在每个月的 12 日上午 10 点运行。

如果这很重要,此页面将全天候运行 24/7。

显然我必须与当前日期进行比较,但我不确定如何检查当前日期和时间是否匹配。

香农

4

5 回答 5

16

不建议使用它,setInterval因为它具有不确定的行为 - 可能会错过事件,或者一次全部触发。时间也会不同步。

下面的代码使用setTimeout分钟的时间段,每分钟重新同步计时器,以尽可能接近 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 回答
4

在要进行检查的页面上添加此

setInterval(function () {
    var date = new Date();
    if (date.getDate() === 12 && date.getHours() === 10 && date.getMinutes === 0) {
        alert("Surprise!!")
    }
}, 1000)

小提琴


更新-添加date.getSeconds == 0以限制它在 10:00:00 仅触发一次。感谢下面的评论

于 2013-09-30T07:00:27.523 回答
3

您可以实例化两个 Date 对象。一个用于现在,一个用于事件的下一个实例。现在很简单: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;
}

如果你想要一些分钟(而不是整个小时,你可以添加 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 回答