Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Часики - реалтайм. (https://javascript.ru/forum/events/68356-chasiki-realtajjm.html)

oxana 11.04.2017 18:35

Часики - реалтайм.
 
Доброго!
Камнями не нужно, я махонькая :)
Прошу совета, не знаю как решить.
Нужно вывести часики (цифровые), на странички, что-бы тикали секунды.
Данно: могу средствами php забрать utc с сервера.
могу прибавить допустим Москву.
Но это вывод - здесь и сейчас!
Средствами php не сделать тик-так!
Как я понимаю в js то же только таймер-счетчик от начало до конца.
Подскажите что-то! Может статейка есть!
В js не очень, совсем не очень - прошу без сухих ответов.
Спасибо!

oxana 11.04.2017 23:45

Rise - Реверансе, ЧМОК!
Я, уже секунды перемножаю на мнуты и.т.д :)
Поясните что это
var t = setTimeout(startTime, 500);
Спасибо!
У, жава весчь но мне не очень дается.
Еще раз Спасибо!

oxana 12.04.2017 00:04

ой, что-то не понимаю где точка отсчета?
Ну работает же! С браузера? Не пойму.
Разжуйте плиз, когда время будет!
Спасибо!

VikDuBBer 14.04.2017 08:02

Rise, по каким соображениям обновление времени происходит каждые пол секунды, ведь если время выводится с точностью до секунд, то смысл делать эту проверку в два раза чаще? + плодится новый экзапляр таймаута каждые пол секунды с аналогичным кодом

пример рабочий, но есть второе решение за счет интервала, а не таймаута (неизвестно, почему его не учли)

VikDuBBer 14.04.2017 08:34

oxana, немного переделанный вариант от Rise
<!DOCTYPE html>
<html>
<body>

<span id="time">(current time)</span>

<script>
setInterval(function() {
    time = new Date(); 
    document.getElementById('time').innerText = time.getHours()+":"+firstNull(time.getMinutes())+":"+firstNull(time.getSeconds());
}, 1000);

function firstNull(time) { return time<10 ? "0"+time : time; }
</script>

</body>
</html>

UPD: экстримально короткая и страшная запись кода))))
<!DOCTYPE html>
<html>
<body>

<span id="time">(time)<script>setInterval(function(){document.getElementById('time').innerText=(t=new Date(),t.getHours()+":"+((m=t.getMinutes())<10?'0'+m:m)+":"+((s=t.getSeconds())<10?'0'+s:s));},1000);</script></span>

</body>
</html>

VikDuBBer 14.04.2017 09:30

Rise, и как раз по тем же соображениям становится некорректным постоянное объявление таймаута - он же и будет накапливать это смещение (допустим функция работает 15ms, таймаут объявляется в конце функции (твой же пример) с задержкой 500ms - по итогу функция сработает по истечению суммы времени, а т.е. 515ms между срабатываниями).

выходит еще один плюс в сторону эффективности интервала (во-первых экзепляр будет срабатывать ни больше, ни меньше через каждую секунду, не зависимо от того, насколько быстро отработал прошлый вызов (1ms или же 400ms), во-вторых не будет постоянного обяъвления дополнительного клона одной и той же логики)

P.S.: и да, рассинхрон хоть и будет, но опять же исключительно с локальным временем компа и то в пределах этой секунды, не стоит забывать. что у юзверя на машине может быть и не фактическое время (например настроеное вручную и без синхронизации с временным сервером)... при осмотре вопроса с этой стороны на рассинхрон даже в 1000ms можно положить большой и крупный

рони 14.04.2017 09:48

:write: как по мне, то лучше никогда не использовать setInterval, особенно из-за его способности "накапливать" запуски на фоновой вкладке, и выстреливать их очередью при фокусе.

VikDuBBer 14.04.2017 10:44

oxana, если цель просто часы, то решений уже достаточно предложено))

а если же цель - изменение контента на стороне клиента в зависимости от текущего времени в определенном часовом поясе, то тут решений еще больше, и они немного сложнее

VikDuBBer 14.04.2017 10:53

рони,
Цитата:

Сообщение от рони (Сообщение 450014)
:write: как по мне, то лучше никогда не использовать setInterval, особенно из-за его способности "накапливать" запуски на фоновой вкладке, и выстреливать их очередью при фокусе.

что за сказки?

рони 14.04.2017 11:01

VikDuBBer,
сказки возможно устарели, браузеры совершенствуются


Часовой пояс GMT +3, время: 05:12.