LoginSignup
31
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-13

ユーザのモバイル端末をそこそこ正確に同期したい瞬間があります。
しかしその為だけにサーバ立てるのも面倒です。

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>


31
26
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
26