Уродливое, кривое решение через жопу. А главное - нерабочее.
Уже через 5-10 минут использования сайта появятся серьёзные расхождения в дате, т.к. setTimeout не гарантирует, что следующий запуск будет точно через секунду, он гарантирует только то что запуск будет не раньше чем через секунду. Малейшее подтормаживание и таймер сбит. Делать надо как-то так было:
<b id="seconds">00:00:00</b>
<script type="text/javascript">
(function(){
var difference = <?php echo time() ?>*1000 - new Date(), //сразу вычисляем разницу между серверным временем и временем на клиенте
block = document.getElementById("seconds");
(function redraw(){
var date = new Date(); //получаем текущую дату клиента
date.setTime( date.getTime() + difference); //прибавляем разницу
block.innerHTML = date.toTimeString().substring(0,8); //форматируем и выводим
setTimeout(redraw, 1000); //запускаем таймер на повтор функции
}())
}())
</script>
|
Щито? Насколько я понимаю php echo сразу выдаётся в поток, script тоже обрабатывается в потоке, т.е. переменная differece появляется практически сразу и лаг не должен составить и пары миллисекунд. А вот с ajax всё вилами по воде писано.
|
Вы ещё tcp пакеты посчитайте.)
Я в php не знаток, но вроде как если специально не включена функция буффера все echo отправляются клиенту сразу без накопления. В любом случае ajax гараздо менее надёжен в плане лага. |
Ajax это в любом случае дополнительный запрос, что даёт огромный простор для лагов. Далее событийная модель опятьже добавляет задержку...
|
Aetae, ваш пример тоже не совсем делает то, что требуется. Если у клиента будет время отличное от сервера, то ваш скрипт будет отображать время клиента, а не время сервера, а значит он не выполняет того, о чем спрашивал автор.
|
Думаю через xhr-запрос можно точнее синхронизировать время. Так мы можем узнать общее время пинга, и поделив его пополам - примерную задержку на доставку ответа от сервера.
|
Цитата:
|
var baseTime = <?php echo time() * 1000 ?>;
var startTime = new Date().getTime();
var UTC = 4;
function redraw(){
var date = new Date() - startTime;
var time = baseTime + date;
var d = new Date(time);
d.setUTCHours(d.getUTCHours() + UTC);
$('.clock').html(d.toUTCString().substring(16, 25));
setTimeout("redraw()", 1000); //запускаем таймер на повтор функции
}
$(document).ready(function()
{
redraw();
});
Вот я написал, не зависит от часовых поясов. Но зависит от времени на компе клиента, если время изменить на неправильное, то время будет неверное :( |
получение времени с сервера.
а на сервере установлен сервер времени? нет ? - "ручная" синхронизация с любым временем может отпасть после любой проблемы синхронизация на клиенте с мировым виндовс служба времени включена ?(по умолчанию нет) -нет? не то что локальное, "мировое" из биоса поднимается - вероятность правильного низкая . пинг делить на 2? -без службы времени в винде погрешность около 15 мс на вычисления |
Саша82, спасибо!
Тут вопрос для какой цели? Мне вот особая точность не нужна, достаточно минуты после загрузки страницы. Сервер халявный, связи с админом практически нет, приходится вставлять костыли, так как время сервера неверное, да ещё гуляет. Повесил часики на гостевой, мне ребята позвонят если сильно отстают, а я забываю иногда сверять. А на стоячее время никто внимания не обратит. |
| Часовой пояс GMT +3, время: 16:58. |