如何在给定的时间和日期运行函数。
例如,我有一个功能,在每个月的12号上午10点,我有一个惊喜,我想告诉他们这个。我怎么能一直运行这个函数,但只在那个时候执行?
正如所指出的那样,这个页面将全天候运行,显然这会影响我的答案。
显然我必须与当前日期进行比较,但我不确定如何检查当前日期和时间是否匹配。
香农
答案 0 :(得分:10)
不建议使用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);
})();
}
答案 1 :(得分:3)
在要进行检查的页面上添加此
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仅触发一个。感谢下面的评论
答案 2 :(得分:2)
你可以使用这样的东西
var runned = false;
var d = new Date();
if(d.getDate() == 12 && d.getHours() == 10 && !runned){
//Do some magic
runned = true;
}
如果你想要一些分钟(而不是整个小时你可以添加d.getMinutes()
答案 3 :(得分:0)
您可以实例化两个Date对象。一个用于现在,一个用于下一个事件实例。现在很简单:新的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)
}
}
答案 4 :(得分:-3)
可以使用和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
}
和