Время NTP JavaScript
Я пишу счет script, который считает время между старой датой и сегодня.
Все работало хорошо, пока я не тестировал компьютер с неправильной датой и видел результаты.
Поэтому я нашел способ получить время 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);
Ответы
Ответ 1
Прежде всего, планировщик JS имеет определенную степень детализации, то есть вы можете запросить интервал меньший, чем, скажем, 20 мс, но он не срабатывает немедленно - то, что вы могли видеть, - это 20 событий, запускаемых каждые 20 мс.
Во-вторых, даже если бы вы могли, это не очень хорошая идея: вы будете делать 1000 запросов каждую секунду, с каждого компьютера, который использует этот script. Даже если клиент и их подключения могут справиться с этим, это не что иное, как DDoS для сервера JSON.
Что вы можете сделать, так это:
- получить время от JSON-NTP (один раз), это будет дата
- получить локальное время (один раз), это будет дата
- вычислить разницу между NTP и локальным временем (один раз), это, вероятно, будет числом мсек, если локальное время выключено.
- для расчета каждого времени, учитывайте разницу
Ответ 2
поместите это прямо вверху документа:
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;
Ответ 3
Я не уверен, что вы понимаете, что такое NTP: А именно, синхронизация внутренних часов на компьютере, а не как использование для часов в себе.
Я бы предположил, что вы один раз подключаетесь к службе NTP, чтобы получить разницу во внутреннем времени клиента и использовать его для исправления. Но я не совсем уверен, почему сравнение с временем клиентского компьютера недостаточно.