質問: お世話になります。 掲題の件、javascriptで正確な時刻を取得する際に "XMLHttpRequest"でレスポンスヘッダ情報の中の "Date"オブジェクトを取得し利用していたのですが、 ここで疑問が! 上記方法で時刻を取得した際、サーバ時刻を取得しているとは思いますが、 この場合の「サーバ時刻(疑問1)」は次のどれでしょうか? 1.NTPサーバの? 2.NTPサーバと同期している場合、同期されているWEBサーバ?? 3.WEBサーバの、ハードウェアクロックもしくはシステムクロック??? 4.上記他 一体どの時刻を取得しているのだろうと思いました。 また、javascriptで正確な時刻を取得する際、 実務で利用する最善の方法(疑問2)は次のどれでしょうか? 1.一般公開されているNTPサーバーへ、JSONP使って取得 2.自前NTPサーバー立てて、JSONP使って取得 3.XMLHttpRequest使って取得する方法で問題ない 4.上記他 お心優しく、懐と知識と股上が深い方がいっらしゃいましたら、 ご教示いただけますと幸いです。 ※股上が浅い方でもOKです! ご回答いただけた方にもれなく、ハートマーク差し上げちゃいます♪ 以上、ひらによろしくお願い申し上げます。
回答: XMLHttpRequestに格納されているDateは、アクセスしたサーバプロセスが返す値です。サーバプロセスが何の時刻を基準にしているかはプロセスやシステムによりけりなので、結局どのサーバにアクセスしたかによってなにを参照しているかはまちまちです。一般的にはサーバプロセスが動いているマシンの時刻になると思います。サーバも自前で立てているなら、確認してみるとよいでしょう。システム時刻をいじったらこのDateに格納される値も変わってくるはずです。 ミリ秒単位で正確な時刻を求めたところで、通信で取ってくる以上絶対に誤差が出ます。「ユーザが偽装できない」正しい現在時刻がほしいとなると、Javascriptでは無理だと思います。なぜならXMLHttpRequestで返す値なんて改ざんし放題だからです。 それを踏まえた上で、NTPへのアクセスが妥当だと思います。 参考: ただし、あまり頻繁に時刻を取りに行く必要があるのであれば、この方法はNTPサーバに負荷をかけるためやってはいけません。自作NTPサーバならそれでもよいかもしれません。