如何在特定时间和日期运行function?

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

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

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

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

香农

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

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

 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()

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

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

  

或者使用javascripts setInterval

 var interval = 300000; // run in 5 minutes window.setInterval("reloadRefresh();", interval); function reloadRefresh() { // do whatever }