使JavaScript间隔与实际时间同步

使JavaScript间隔与实际时间同步,javascript,time,Javascript,Time,我想使秒数与实时(newdate())秒数同步,这样,如果页面是在秒中加载的,它就可以工作了 setInterval(() => { console.log("hey im not synchronized"); }, 1000); 可能吗 可能吗 是的,像这样: setTimeout(() => { setInterval(() => console.log("hey im synchronized"), 1000) }, 1000 - new Date()

我想使秒数与实时(
newdate()
)秒数同步,这样,如果页面是在秒中加载的,它就可以工作了

setInterval(() => {
    console.log("hey im not synchronized");
}, 1000);
可能吗

可能吗

是的,像这样:

setTimeout(() => {
    setInterval(() => console.log("hey im synchronized"), 1000)
}, 1000 - new Date().getMilliseconds());
可能吗

是的,像这样:

setTimeout(() => {
    setInterval(() => console.log("hey im synchronized"), 1000)
}, 1000 - new Date().getMilliseconds());

为此,您需要一个自同步定时循环。其基本思想不是使用
setInterval()
,而是每次计算希望下次触发循环的毫秒数,然后使用
setTimeout()
等待

以下是一个基本示例:

函数oncePerSecond(回调){
var timerFunc=函数(){
//将当前时间四舍五入到整秒钟(有10%的余量)
var now=1000*Math.floor(Date.now()/1000+0.1);
//运行回调
回调(现在);
//等待下一整秒钟
setTimeout(timerFunc,now+1000-Date.now());
};
timerFunc();
}
//创建一个演示计时器
oncePerSecond(函数(现在){
document.getElementById('local').textContent=新日期(现在).toString();
});
//为第二个计时器添加0.5秒的人工延迟
setTimeout(函数(){
oncePerSecond(函数(现在){
document.getElementById('utc').textContent=新日期(现在).toutString();
});
}, 500);
当地时间现在是:


UTC时间现在是:…

为此,您需要的是一个自同步定时循环。其基本思想不是使用
setInterval()
,而是每次计算希望下次触发循环的毫秒数,然后使用
setTimeout()
等待

以下是一个基本示例:

函数oncePerSecond(回调){
var timerFunc=函数(){
//将当前时间四舍五入到整秒钟(有10%的余量)
var now=1000*Math.floor(Date.now()/1000+0.1);
//运行回调
回调(现在);
//等待下一整秒钟
setTimeout(timerFunc,now+1000-Date.now());
};
timerFunc();
}
//创建一个演示计时器
oncePerSecond(函数(现在){
document.getElementById('local').textContent=新日期(现在).toString();
});
//为第二个计时器添加0.5秒的人工延迟
setTimeout(函数(){
oncePerSecond(函数(现在){
document.getElementById('utc').textContent=新日期(现在).toutString();
});
}, 500);
当地时间现在是:


UTC时间现在是:…

请注意,这将尽可能接近开始时的时间,但如果时间间隔运行很长时间,则可能会出现偏差。如果您需要始终保持精确,则应定期进行此类检查。@blex是正确的。JS中的超时和间隔通常可能高达几十毫秒。此外,如果有一些CPU要求高的任务,以至于没有空闲窗口来执行间隔任务,那么去同步将累积起来。请注意,这将在开始时尽可能接近,但如果间隔长时间运行,则可能会出现分歧。如果您需要始终保持精确,则应定期进行此类检查。@blex是正确的。JS中的超时和间隔通常可能高达几十毫秒。此外,如果有一些需要CPU的任务,以至于没有空闲窗口来执行间隔任务,那么去同步将累积起来。