据我所知(而且我知道的相对较少),例如,没有发出的本机事件。秒针嘀嗒。我想出的最好的方法是反复检查 Date 对象(例如,每隔333ms;较短的间隔会导致更高的精度,但也会占用更多的资源)。不知何故,如果我反复使用相同的 Date 对象,时间不会更新,而
Date.prototype.getSeconds()
日志' NaN'虽然 typeof 是' number'。
function clock(interval) {
var d = new Date();
var secondsOld = d.getSeconds();
d = null;
setInterval(function() {
var d = new Date();
var secondsNew = d.getSeconds();
if ( secondsNew !== secondsOld ) {
secondsOld = secondsNew;
// trigger something
console.log(secondsOld);
}
d = null;
}, interval);
}
答案 0 :(得分:5)
你是对的,因为没有本地时钟滴答事件。我能解决此问题的最佳效果是使用setTimeout()
和Date.now()
。
创建一个每秒调用setTimeout()
的递归函数。确切地说,将超时设置为该函数调用的下一个确切秒数。这是一个例子。
// milliseconds per second
var SECOND = 1000;
function bindClockTick(callback) {
function tick() {
var now = Date.now();
callback(now);
setTimeout(tick, SECOND - (now % SECOND));
}
tick();
}
bindClockTick(function(ms) {
console.log('tick! milliseconds: '+ ms);
});
这使用Date.now()
而不是创建Date
类的新实例。
这里有JSFiddle来测试精度。 该演示使用new Date()
轻松显示当前时间,但只需几毫秒即可完成。
答案 1 :(得分:0)
我不确定你为什么要与确切的第二次更改同步;但是,我会这样做:
function clock() {
var startMs = Date.now(),
startSecs = Math.floor(startMs / 1000),
firstOffset = 1000 - startMs % 1000;
function tick () {
var ms = Date.now(),
secs = Math.floor(ms / 1000),
dSecs = secs - startSecs;
console.log(dSecs);
}
setTimeout(function () {
tick();
setInterval(tick, 1000);
}, firstOffset);
tick();
}
clock();
以下是发生的事情:
firstOffset
)setTimeout
设置为此偏移量,确保它会在下一秒刻度时触发。setInterval
1000毫秒将继续每秒更新。