在JavaScript中单调增加时间的最佳方法是什么?我希望有类似Java的东西System.nanoTime().
Date() 显然不会起作用,因为它受系统时间变化的影响.
换句话说,我想要的是<= b,总是:
a = myIncreasingTime.getMilliseconds();
...
// some time later, maybe seconds, maybe days
b = myIncreasingTime.getMilliseconds();
Run Code Online (Sandbox Code Playgroud)
充其量,即使在使用UTC函数时Date(),它也会返回它认为正确的时间,但如果有人向后设置时间,则下一次调用Date()可以返回较小的值.System.nanoTime()不受此限制(至少在系统重新启动之前).
修改: [2012-02-26:无意影响原始问题,具有赏金]
我不知道"壁挂时间",我有兴趣知道经过的时间有一定的准确性,这Date()是无法提供的.
4es*_*n0k 17
您可以使用window.performance.now() - 自Firefox 15和window.performance.webkitNow() - Chrome 20]
var a = window.performance.now();
//...
var delay = window.performance.now() - a;
Run Code Online (Sandbox Code Playgroud)
你可以包裹Date()或Date.now()强迫它是单调的(但不准确).草图,未经测试:
var offset = 0;
var seen = 0;
function time() {
var t = Date.now();
if (t < seen) {
offset += (seen - t);
}
seen = t;
return t + offset;
}
Run Code Online (Sandbox Code Playgroud)
如果系统时钟在给定时刻被设置,那么似乎没有时间过去(并且包含该间隔的经过时间将是不正确的),但是您至少不会有负增量.如果没有后退,则返回相同的值Date.now().
如果您正在编写游戏模拟循环,这可能是一个合适的解决方案,例如,time()极其频繁地调用 - 最大错误是调用次数乘以调用间隔的次数.如果您的应用程序自然不会这样做,您可以明确地将其称为setInterval(假设系统时钟没有使用),以便以某些CPU时间为代价来保持您的准确性.
也可以将时钟向前设置,这不会阻止单调性,但可能具有同样不期望的效果(例如,游戏花费太长时间试图立即赶上其模拟).然而,这与已经睡了一段时间的机器没有特别的区别.如果需要这样的保护,它只是意味着改变现有条件旁边的条件,并保持可接受进度的恒定阈值:
if (t > seen + leapForwardMaximum) {
offset += (seen - t) + leapForwardMaximum;
}
Run Code Online (Sandbox Code Playgroud)
我建议leapForwardMaximum应该设置为超过1000毫秒,因为,例如,Chrome(如果我没记错的话)限制背景标签中的计时器每秒触发不超过一次.