使用performance.now()校准时间是否安全?

时间:2019-07-10 14:44:37

标签: javascript date datetime

我想知道我是否没有预见到我的方法可能存在的问题。

class RDate {
    constructor(serverIsoDate) {
        this.serverDate = new Date(serverIsoDate);

        this.localDate = new Date();
        this.localTick = performance.now();
    }

    getCompensatedDate() {
        return this.serverDate.getTime() + (performance.now()-this.localTick);
    }
}

我会定期获取serverDate,但是如果用户长时间停止运行Webapp,即使用户欺骗了自己的时钟,我也可以保证正确的时间。

当选项卡被挂起时,Performance.now是否溢出或暂停?

我可以通过计算localDate和localTick之间的差异来检测时钟漂移或被欺骗的程度

_spoofed() {
    return Math.abs(this.localDate.getTime() - this.localTick - (Date.now() - performance.now())) > 1000 * 60 * 60;
}

1 个答案:

答案 0 :(得分:0)

Performance API上的MDN文档说:

  

由于平台的系统时钟会受到各种偏差(例如NTP调整)的影响,因此接口支持单调时钟,即时钟始终在增加。

这似乎表示performance.now()使用的时钟应独立于系统时钟。

我认为它的时钟不能暂停。 performance.now()的描述为:

  

返回值表示自时间原点起经过的时间。

标签页暂停后,时间原点不会改变,因此应包含暂停时间。