2013-09-30 78 views
4

如何在给定的时间和日期运行一个函数。如何在特定时间和日期运行某个功能?

例如,我有一个函数,在每个月的12号上午10点,我有一个惊喜,我想告诉他们。我怎样才能始终运行此功能,但只能在当时执行?

正如指出的,这个页面将全天候运行,显然这可能会影响我的答案。

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

Shannon

+2

你怎么知道他们会在你的特定网页在那个时间和日期? – Alnitak

+0

检查'新日期()。getDate()'为当天,'新日期()。getHours()'为小时。我希望你不要指望其他人为你编写整个代码。 –

+0

@Alnitak,通过与当前日期进行比较? –

回答

8

它不建议使用setInterval因为它具有不确定性的行为 - 事件可以被忽略了,或者火的一次。时间也会不同步。

下面的代码,而不是使用setTimeout1分钟周期,其中每分钟计时器重新同步,以便尽可能接近下降到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); 
    })(); 
} 
+0

这很有趣!所以我假设你传递给惊喜函数的cb也是一个函数?意思是说你像这样运行:'surprise(otherFunctionName);'。你介意我问你为什么这样做? –

+0

是的,这是正确的 - “为什么”被称为“关注点分离” - 将“什么时候”从“what”分离出来。 – Alnitak

+0

如果您使用Modula来计算余数毫秒,您是否同意以毫秒为单位的分钟值作为变量会更有用?我猜也会更好一些,但我确实喜欢你的解决方案,它应该会很好。 –

1

您可以实例化两个Date对象。一个现在和一个下一个事件的例子。现在很简单:新的日期()。对于下一个实例,您可以遍历选项,直到找到比现在更大的选项。或者做一些更复杂的日期时间巫术。比较两者的getTime(),然后为警报执行setTimeout。

编辑: 自@Alnitak指出,有一个超时的最大值,请参阅setTimeout fires immediately if the delay more than 2147483648 milliseconds

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) 
    } 
} 
3

在其中o想做的页面检查添加此

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

FIDDLE


更新 - 添加date.getSeconds == 0限制它开火只有一个在10:00: 00。由于下面

+1

正是我需要提及的,谢谢! –

+3

这段代码有bug,一个可见,一个不可见。看不见的错误是它会一遍又一遍地重复显示警报,直到时间到达10:01。 – Alnitak

+0

@Alnitak怎么会来,你可以更新小提琴吗? – bhb

2

评论您可以使用类似这样

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

`如果你想要一些与分(而不是整个小时就可以添加d.getMinutes()

+0

为什么downvote o.0? –

+0

for'=='12'' - '.getDate()'的输出是一个_number_ – Alnitak

+0

在那里有点快,现在修复:) –

-3

也许使用和iframe与元刷新和锻炼的内容服务器端

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

,或者使用JavaScript的setInterval的

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

function reloadRefresh() { 
// do whatever 
} 

相关问题