В JavaScript времени NTP

Я пишу сценарий подсчета, который считает время между старой датой и сегодня.
Все работало хорошо, пока я не проверил на компьютере с неправильной датой и не увидел результаты.
Поэтому я нашел способ получить время NTP через http://json-time.appspot.com/time.json.
Проблема в том, что мне нужно текущее время каждую миллисекунду, потому что я хочу подсчитать миллисекунды, но его невозможно отправить запрос на сервер NTP каждую миллисекунду.
Это пример кода, чтобы увидеть, что я пишу о

            var today;
        $(document).ready(function(){

            $.data = function(success){
                $.get("http://json-time.appspot.com/time.json?callback=?", function(response){
                    success(new Date(response.datetime));
                }, "json");
            };
        });

        function update(){
            var start = new Date("March 25, 2011 17:00:00");
            //var today = new Date();
            $.data(function(time){
                today = time;
            });
            var bla = today.getTime() - start.getTime();
            $("#milliseconds").text(bla);
        }

        setInterval("update()", 1);

3 ответов


прежде всего, планировщик JS имеет определенную гранулярность - то есть вы можете запросить интервал меньше, чем, скажем, 20 мс, но он не будет срабатывать сразу - то, что вы могли видеть, это 20 событий, запускаемых каждые 20 мс.

во-вторых, даже если бы вы могли, это не очень хорошая идея: вы бы сделали 1000 запросов каждый второй С компьютер, который использует этот скрипт. Даже если клиент и его связи могли бы справиться с этим, это не что иное, как DDoS для сервера JSON.

Что вы могли бы сделать это:

  • получить время от JSON-NTP (один раз), это будет дата
  • получить местное время (один раз), это будет дата
  • вычислите разницу между NTP и местным временем (один раз), это, вероятно, будет количество мсек, что местное время выключено
  • для каждого расчета времени учитывайте разницу

поместите это прямо в верхней части документа:

var clientTime = new Date();

и это прямо в нижней части вашего документа:

var serverTime = new Date("<have the server put here its current date/time along its timezone>");
var deltaTime = serverTime - clientTime; // in milliseconds (expected accuracy: < 1 second)

тогда, если вам нужно знать длительность чего-нибудь:

var startTime = new Date();

// [processing...]

var endTime = new Date();
var duration = endTime - startTime; // in milliseconds
var startTimeServer = startTime + deltaTime;
var endTimeServer = endTime + deltaTime;

Я не уверен, что вы понимаете, для чего NTP: а именно синхронизация внутренних часов в компьютере, а не как использование для часов в себе.

Я бы предложил, чтобы вы подключились к службе NTP один раз, чтобы получить разницу во внутреннем времени клиента и использовать это, чтобы исправить его для отображения. Но я не совсем уверен, почему сравнения с клиентским компьютером времени недостаточно.