Javascript 如何在特定时间运行函数&;约会?

Javascript 如何在特定时间运行函数&;约会?,javascript,jquery,date,time,Javascript,Jquery,Date,Time,如何在给定的时间和日期运行函数 示例:我有一个函数需要在每月12日上午10点运行 如果这很重要,此页面将全天候运行 显然,我必须与当前日期进行比较,但我不确定如何检查当前日期和时间是否匹配 香农您可以实例化两个日期对象。一个用于现在,另一个用于事件的下一个实例。现在很简单:新日期()。对于下一个实例,您可以循环浏览选项,直到找到比现在更大的选项。或者做一些更复杂的约会时间魔法。比较两者的getTime(),然后对警报执行setTimeout 编辑: 更新自@Alnitak指出超时存在最大值,请参

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

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

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

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


香农

您可以实例化两个日期对象。一个用于现在,另一个用于事件的下一个实例。现在很简单:新日期()。对于下一个实例,您可以循环浏览选项,直到找到比现在更大的选项。或者做一些更复杂的约会时间魔法。比较两者的getTime(),然后对警报执行setTimeout

编辑: 更新自@Alnitak指出超时存在最大值,请参阅


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

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时仅发射一次。感谢下面的评论

您可以使用类似的内容

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

如果你想在分钟(而不是整个小时)内增加一些,你可以添加d.getMinutes()

也许可以在元刷新和训练内容服务器端使用和
iframe

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

而且不建议使用
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);
    })();
}

您如何知道它们将在该时间和日期出现在您的特定网页上?检查当天的
new date().getDate()
,以及
new date().getHours()
一小时。我希望你不要指望其他人为你写完整的代码。@Alnitak,通过与当前日期进行比较?不,我不知道@JoeSimmons,我只是不知道如何开始。@ShannonHochkins你没有领会我的意思。你要求的是JS代码。JS代码在浏览器中运行。这意味着你期待的是这个特定的page如果不是全天候运行,那么至少在您“惊喜”的时候是应该发生的。这似乎是一个,嗯,不寻常的网页应用程序。这段代码有两个bug,一个是可见的,一个是不可见的。不可见的bug是它会反复显示警报,直到时间达到10:01。@Alnitak,同样,你的评论是基于我只想运行一次函数的假设,而且,完全由用户来编写代码也不是件容易的事,很明显,一旦时间间隔过了,就要清除它。@ShannonHochkins如果你清除了时间间隔,它下个月就不会启动了(假设页面在两次之间没有重新加载)。我认为这样你可能会很不走运,错过你正在等待的那一秒,时间安排并不那么精确。可能是第一个时间安排在11:59:59.999,下一个时间安排在12:00:01.000,因为
=='12'
.getDate()
的输出速度有点快,现已修复:)真有趣!所以我假设cb,也就是传递给惊奇函数的,也是一个函数?这意味着您可以这样运行:
shopping(otherFunctionName)。你介意我问你为什么这样做吗?是的,没错,“为什么”被称为“关注点分离”-将“什么时候”和“什么”分开。如果你用模来计算毫秒的剩余时间,你同意把毫秒的分钟值作为变量会更有用吗?我想它读起来也会好一点,但我确实喜欢你的解决方案,它应该会很好。@ShannonHochkins re:60s-我想由你决定。就我个人而言,我读了60000,转换是瞬间的。请注意,即使是这种方法也不是没有风险的-如果系统时钟在该代码下调整,计时器可能会在时间不完全(尚未)10:00:xx时触发。不过,要缓解这种情况实际上相当困难!酷,不用担心@Alnitak,谢谢你的帖子,不过我想问一个简单的问题,如果我是在服务器端而不是客户端,有没有办法在网页上仍然有一个用户界面来“选择”时间,并且仍然正确地启动计时器,而不需要不断打开页面?可能不对。。
var interval = 300000; // run in 5 minutes
window.setInterval("reloadRefresh();", interval);

function reloadRefresh() {
 // do whatever
}
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);
    })();
}