ユーザのモバイル端末をそこそこ正確に同期したい瞬間があります。
しかしその為だけにサーバ立てるのも面倒です。
NICTがJSONサーバを建ててくださっているので、そちらを使いましょう。
一応、負荷をかける使い方はしない方がいいかと思います。
日本標準時プロジェクト https/http を介してアクセスされる場合
ポイント
下記の3つから、レイテンシを考慮した現在時刻を計算します。
- リクエスト送信時(クライアント)
- サーバ時刻(JSON内)
- レスポンス受信時(クライアント)
概ね、レイテンシは「(レスポンス受信時 - リクエスト送信時 )/ 2」となると思われます。
そのため、現在時刻を計算するには、サーバ時刻からレイテンシ分進めてあげればいいことになります。
ソースコード
NTPを元に現在時刻との差分を計算し、なるべく正確な時刻を表示するサンプルです。
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="bower_components/superagent/superagent.js"></script>
</head>
<body>
<p id="timeAmount"></p>
<script>
var request = window.superagent;
var sendTime = new Date().getTime();
request.get("https://ntp-a1.nict.go.jp/cgi-bin/json")
.end(function(res){
var timeobj = res.body;
var endTime = new Date().getTime();
console.log("latency: " + (endTime - sendTime) / 2 + "ms");
var fixedTime = parseInt(timeobj.st * 1000 + (endTime - sendTime) / 2, 10);
var localTime = new Date().getTime()
var offset = fixedTime - localTime;
console.log("fixedTime: " + fixedTime);
console.log("localTime: " + localTime);
console.log("offset: " + offset);
setInterval(function(){
var el = document.querySelector("#timeAmount");
el.innerText = new Date(new Date().getTime() + offset);
}, 10);
});
</script>
</body>
</html>