Edited at

多分正確な時刻をNTPから取る

More than 3 years have passed since last update.

ユーザのモバイル端末をそこそこ正確に同期したい瞬間があります。

しかしその為だけにサーバ立てるのも面倒です。

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>