我想知道我是否没有预见到我的方法可能存在的问题。
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;
}
答案 0 :(得分:0)
Performance API上的MDN文档说:
由于平台的系统时钟会受到各种偏差(例如NTP调整)的影响,因此接口支持单调时钟,即时钟始终在增加。
这似乎表示performance.now()
使用的时钟应独立于系统时钟。
我认为它的时钟不能暂停。 performance.now()
的描述为:
返回值表示自时间原点起经过的时间。
标签页暂停后,时间原点不会改变,因此应包含暂停时间。