В 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 один раз, чтобы получить разницу во внутреннем времени клиента и использовать это, чтобы исправить его для отображения. Но я не совсем уверен, почему сравнения с клиентским компьютером времени недостаточно.