export class TimeStampService { private _localTimestamp: number; // 本地时间戳 private _serveTimestamp: number; // 服务器端时间戳 private _duration: number = 1000 * 60 * 5; // 时间戳更新频率 (毫秒) private _timeDiffer: number; // 服务器和本地的时间差 服务器-本地 constructor( ) { this._timeDiffer = 0; this.getTimeDiffer(); } private getTimeDiffer() { const xhr = new XMLHttpRequest(); xhr.open('get', environment.URL_TIME, true); const that = this; xhr.onload = function () { if (this.status === 200) { const result = JSON.parse(this.response); const now = new Date().getTime(); that._timeDiffer = result.data.timestamp - now; } }; xhr.onerror = function () { console.log('xhr error', xhr); }; xhr.send(); } get Duration() { return this._duration; } get ServerTimeStamp() { if (!this._localTimestamp) { this._localTimestamp = new Date().getTime(); } else { const now = new Date().getTime(); // 提前30秒做一次异步矫正 if (now - this._localTimestamp > this.Duration - 1000 * 30) { this.getTimeDiffer(); // 更新差值 防止用户修改本地时间 } if (now - this._localTimestamp > this.Duration) { this._localTimestamp = now; } } this._serveTimestamp = this._localTimestamp + this._timeDiffer; return this._serveTimestamp; }}
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cjlyulghccgo