Как синхронизировать время на таймере между сервером и браузером с помощью JS?

На сайт нужно поставит таймер с обратным отчетом который должен быть одинаковым для всех пользователей.
Я пробовал вставлять в JS код время с помощью PHP, но секунды на таймере пользователей все равно отличались. Можно ли с помощью JavaScript сделать так чтобы время у разных пользователей было одинаково в точности до секунды?
  • Вопрос задан
  • 3234 просмотра
Решения вопроса 2
sergiks
@sergiks Куратор тега PHP
♬♬
Наверное, надо написать что-то похожее на cинхронизацию времени между клиентом и серверами в NTP. Это потребует нескольких запросов к серверу, чтобы оценить время отклика – т.е. не сразу с загрузки страницы удастся точно запустить таймер. Показать его можно сразу, и в течение следущих секунд скорректировать. Есть готовое решение: NTPJS, не пробовал.

В простейшем варианте можно обойтись одним AJAX запросом после полной загрузки страницы. Запомнить текущее локальное время var tPing = (new Date).getTime();, запросить ajax'ом с сервера его текущее время tServ, получить ответ и запомнить локальное время tPong, когда ответ получен. И положиться на очень грубую гипотезу, что сервер ответил точно посередине интервала tPing..tPong. Т.е. решить, что разница серверного времени и локального составляет ровно tDiff = tServ - tPing + (tPong - tPing) / 2;

Теперь для получения предполагаемого серверного «точного» времени, просто прибавлять к текущему локальному времени этот tDiff.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Отправляете засечку времени от клиента на сервер (можно для точности 2-3 ajax-запроса), а сервер - считает смещение (в "+" или в "-" и на сколько) минус время на доставку пакета (по http/tcp-заголовкам).
Но лучше, это делать через websocket, периодически отсылая сигнал синхронизации сразу всем клиентам.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Есть реализации NTP на javascript, обычно достигается точность около 20ms.

jehiah.cz/a/ntp-for-javascript
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы