我有这样的代码:
var d0 = new Date();
...
...
var d1 = new Date();
if (d0>d1) {
console.log("Problem");
}
先看,D1不可能比D0老。 但我两天前刚刚在生产服务器中经历过。 d1 比 d0 早几毫秒。 怎么可能?
Date() 来自什么?是来自 V8 还是来自操作系统?
如果不仔细研究你的系统,很难说,但总的来说,使用日期和时间库进行编程偶尔会非常非常奇怪。
推荐阅读:程序员相信时间的谎言
我最近在生产机器上的 v8 中遇到了类似的问题,并且(我们认为)正在发生的是网络时间守护进程正在更改系统的时钟 - 正如它的设计一样。因此,我们偶尔会有一些分析,说我们的"结束时间"在我们的"开始时间"之前,因为系统时钟在代码执行过程中被NTP重新同步。
许多服务器使用某种方法将其系统时间同步到某个更高的权限(使用 NTP 或其他协议)。 此同步是定期完成的,如果有必要使系统的时钟恢复同步,可能会导致时间向后移动。 这是对您自己的代码异步完成的,因此它可能发生在这两个new Date()
调用之间。
new Date()
的价值最终来自 V8 调用以获得时间的操作系统。