JavaScript

サーバの時刻で補正するJavaScriptモジュール

More than 1 year has passed since last update.

何かしらの理由でサーバ側を一切弄れない状況において、サーバ側の時刻で正確な時刻に補正するモジュールを作成した。

ローカル端末の時刻が正しくないときを考慮したい場合に利用する。

下記コードは、vue-cliを用いてビルドしたソースをフロント側で使用することを前提にしている。

export default class ServerClock {

offset = 0
getted = false

getDate = function (force = false) {
if ((!this.getted) || force) {
this._setOffset()
}
return this._getDate()
}

_setOffset = function () {
var previous = new Date()
var serverDate = this._getServerDate()
var ended = new Date()

var mean = Math.floor((ended.getTime() - previous.getTime()) / 2)
var localTime = ended.getTime() - mean

this.offset = serverDate.getTime() - localTime

this.getted = true
}

_getServerDate = function () {
var r = new XMLHttpRequest()
if (!r) {
return null
}
r.open('HEAD', '#', false)

// ブラウザにキャッシュさせない
r.setRequestHeader('Pragma', 'no-cache')
r.setRequestHeader('Cache-Control', 'no-cache')

r.send(null)
return new Date(r.getResponseHeader('Date'))
}

_getDate = function () {
return new Date(Date.now() + this.offset)
}
}

上記モジュールを以下のようにして使用する。

import ServerClock from './ServerClock.js'

serverClock = new ServerClock()
timeNow = serverClock.getDate()