当前时间早于之前节省的时间

Dan*_*J F 8 javascript time

我的假设是时间总是向前发展,但显然有时它不会以这种方式发生.

我有以下示例:

var LOOP_MS = 100;

var prevCall = +new Date();

setTimeout(function loop() {
    foobar();

    setTimeout(loop, LOOP_MS);
}, LOOP_MS);

function foobar() {
    var now = +new Date(),
        diff = now - prevCall;  // expected to be somewhere around LOOP_MS

    // do stuff
    console.log(diff);

    prevCall = now;
}
Run Code Online (Sandbox Code Playgroud)

现在,大部分时间它按预期工作,并diff显示接近100的数字.当然,在现实生活中,我希望数字上升,特别是当用户的计算机执行一些繁重的操作时.

我不指望的是看到一个负数,但它发生了.怎么可能?我错过了什么吗?我想也许它可能是由不同的时区造成的,但事实并非如此.我也在不同的浏览器(Chrome,Firefox,Safari)中看到它,并且diff值非常不一致:从-9到-100 000.

它发生在大约0.025%的生产案例中,所以这不是一个大问题,但我想知道它究竟是如何发生的(甚至在理论上)?

我认为通过在慢速VM中运行脚本并模拟高CPU负载,我设法在本地重现了几次,但我仍然不明白为什么函数会显示负数(意思now是,比旧版本更长prevCall).

Pao*_*olo 3

大多数计算机都配置为使用 NTP 服务器来设置系统时钟。

由于系统时钟是第一次设置,通常它将保持同步,无需更新。

有时(很少)由于各种原因,系统时钟可能会不同步。

由于系统时钟与 NTP 服务器时间不匹配,因此会更新并且可能会倒退。

NTP 服务(通常)配置为避免时钟倒退:如果“间隙”足够小,NTP 守护进程会尝试“减慢”系统时钟,直到再次进入 sysnc。但正如刚才所说,这取决于配置和时间间隙的大小。

我认为在极少数情况下,上述所有原因都会导致您遇到的问题。

您可能会发现这很有趣:有没有办法确保 ntp 同步时钟永远不会向后移动?


如果您使用的是 macOS,您可以尝试打开控制台并搜索ntpd.

在我的机器(10.9.5 的 MBP)上,我看到几行这样的......

Apr  2 01:11:40 mac-di-paolo.local ntpd[46]: ntpd: wake time set -1.848017 s
Run Code Online (Sandbox Code Playgroud)

...记录系统时钟调整。