JavaScript

Как сделать таймер на js

В интернете встречаются всего два типа таймеров:
1-обратного отсчёта на определённую дату и время
2-таймер от локального времени
Мне нужен таймер обратного отсчёта, но не на какую то определённую дату, а на 3 часа, при том он должен быть зациклен, и самое важное, он должен быть, не знаю как назвать... глобальным? В общем, чтобы он всегда показывал одинаковое время у всех пользователей, если осталось 2 часа 34 минуты, то и у Васи и у Пети отображалось это время.
Чтоб он был глобальным надо чтоб он брал время с сервера в большинстве случаев на сервере можно запускать скрипты на PHP надо создать файл содержащий скрипт
<?php echo echo @date('U'); ?>
А у клиента должен происходить запрос по аджакс с сервера тогда у всех будет время синхротронно

SX
Slava Xxx
93 711
Лучший ответ
Slava Xxx А наклиенти должен работать скрипт вот такой

function st(){
let req = new XMLHttpRequest();
req.open("GET","/p/date/d.php",true);
req.onreadystatechange = function(){
d = req.responseText;setInterval(()=>{let dd=d%(3*60*60);console.warn((dd/(3600*3)^0)+":"+((dd/(3600*3))*60^0)+":"+(((dd/(3600*3))*60)%1*60^0));d--},1000)
}
req.send();
}

Таймер обратного отсчета выводится в консоль

Slava Xxx Вот правильный правленый вариант циклический таймер на убывание интервал три часа

function st(){
let req = new XMLHttpRequest();
req.open("GET","/d.php",true);
req.onreadystatechange = function(){if (this.readyState != 4) return;if(this.status==200){console.warn('Старт!');
d = +req.responseText;setInterval(()=>{let dd=(3600*3)-(d%(3*60*60));console.warn((dd/3600^0)+":"+((dd%3600)/60^0)+":"+((dd%3600)%60));d++},1000)
}}
req.send();
}

Только на сервере надо создать в корне файл d.php
и положить в него <?php echo @date('U'); ?> тогда всё работает результат в консоли виден

setTimeout в помощь.
или setInterval, если не один раз.
Если одинаковое время, тогда передавай с сервера.
AT
Asia Trans Tour
90 247
Каким же образом JS (выполняющийся локально в браузере Васи) узнает время на компах Пети, Коли, и других персонажей? Прааально, никак.
Время необходимо получать из интернета - хоть со своего сервера, хоть с чужого (XMLHttpRequest/$.ajax). Далее, от этого времени посчитать остаток мс до следующего срабатывания, и ставить на этот остаток таймер через setTimeout - где сделать две вещи: 1. однократно выполнить код итерации; 2. поставить этот код на дальнейшее повторение с интервалом (через setInterval).
Кодом короче, чем словами:
setTimeout(() => {
 doSomething();
 setInterval(doSomething, 1.08e7);
}, timeLeft);
Аяксовую часть не пишу, т. к. ее можно по-разному реализовать.
́
Если же необходимо реализовать вывод обратного отсчета, то лучше сделать по-другому: хранить датувремя (timestamp) следующего срабатывания, и в интервале считать разность с текущим временем (выводим ее всегда, а затем проверяем: если разность <= 0, то выполняем код итерации 3часового цикла и заносим новый timestamp в "контрольную" переменную, просто прибавляя 3ч к текущему времени).
ПД
Павел Домнин
57 967