Привязать таймер к серверному времени
Помогите адаптировать таймер под работу с серверным временем.
Надо вычислить разницу во времени между сервером и клиентом и с учетом ее корректировать вывод скрипта. function get_timer_223(string_223) { var date_new_223 = string_223; var date_t_223 = new Date(date_new_223); var date_223 = new Date(); var timer_223 = date_t_223 - date_223; if(date_t_223 > date_223) { var day_223 = parseInt(timer_223/(60*60*1000*24)); if(day_223 < 10) { day_223 = "" + day_223;} day_223 = day_223.toString(); var hour_223 = parseInt(timer_223/(60*60*1000))%24; if(hour_223 < 10) {hour_223 = "0" + hour_223;} hour_223 = hour_223.toString(); var min_223 = parseInt(timer_223/(1000*60))%60; if(min_223 < 10) {min_223 = "0" + min_223;} min_223 = min_223.toString(); var sec_223 = parseInt(timer_223/1000)%60; if(sec_223 < 10) {sec_223 = "0" + sec_223;} sec_223 = sec_223.toString(); timethis_223 = day_223 + " : " + hour_223 + " : " + min_223 + " : " + sec_223; $(".timerhello_223 div.result3 .result-day3").text(day_223); $(".timerhello_223 div.result3 .result-hour3").text(hour_223); $(".timerhello_223 div.result3 .result-minute3").text(min_223); $(".timerhello_223 div.result3 .result-second3").text(sec_223); }else { $(".timerhello_223 div.result3 .result-day3").text("00"); $(".timerhello_223 div.result3 .result-hour3").text("00"); $(".timerhello_223 div.result3 .result-minute3").text("00"); $(".timerhello_223 div.result3 .result-second3").text("00");} } function getfrominputs_223(){ string_223 = "<?php echo date("m/d/Y"); ?> 23:59:59"; get_timer_223(string_223); setInterval(function(){get_timer_223(string_223);},1000);} $(document).ready(function(){ getfrominputs_223();}); |
Vadya,
какая разница сколько времени у клиента, если вам нужно завести таймер на какой-то срок, этот период и посылайте клиенту а не дату окончания. и на клиенте дата окончания будет new Date() + ваш срок умноженный возможно на 1000, если срок в секундах. |
рони,
Спасибо за альтернативный путь, но не могу на js реализовать Выручайте, на форумы только в крайнем случае от безисходности обращаюсь. Cчитаю разницу в миллисекундах между сервером и клиентом: var difference = <?php echo time(); ?> * 1000 - new Date(); Но привести в формат 'm/d/Y H:i:s' не могу Представляю как-то так: date('m/d/Y H:i:s', time() + $difference/1000), но на js |
Vadya,
с php не помогу |
Получается что у меня сейчас все упирается только в чистый js, много лишнего в прошлом посте написал.
Кто коротает свободное время, помогайте. Задача перевести количество секунд в формат: месяц/день/год часы:минуты:секунды |
Цитата:
Если клиентский скрипт должен оперировать по времени сервера, то более точным время сервера на клиенте будет как время клиента плюс/минус разность часовых поясов сервера и клиента. |
Vadya,
Типично для этого в хидере выдают скрипт переменную отправки сервером страницы в абсолютном времени и на юзере скрипт проверяет разницу между своим таймером в абсолютном времени и таймером отдачи, скрипт естественно должен стоять в хидере <script type="text/javascript"> var RequestTime = 1478474789; //Время отдачи </script> <script type="text/javascript"> var Delta = +new Date()/1000 - RequestTime; </script> |
Deff, время 1478474789 сервера, это иное время на клиенте, и их разность без учета смещения клиента, это билиберда. А абсолютное время по определению Ньютона, это "само по себе и по самой своей сущности, без всякого отношения к чему-либо внешнему". :)
|
Цитата:
var sek = 1478474789; var a = new Date(sek*1000).toString().split(' ').slice(1, 5).join('/'); alert(a) |
laimas,
Смещение ты могёшь взять из рапарса alert(new Date().toString().split(' ').slice(5)) Время сервера выдаётся абсолютное! GMT+0 |
Цитата:
|
laimas,
:yes: Ну как обычно, кады время на клиенте(в js => +new Date()) переводишь в миллисекунды - автопривязка к лондонскому (Ни наю как на PHP) но думаю нетрудно и там так жа сделать и выдать Тогда Разность( при переводе в тики на клиенте) и сервером строго фиксированная, независима от размещения сервера и клиента Посколь вычисляется на одном и том жа меридиане //laimas, поверь, я с этими привязками и с таким вариантом работаю шесть лет |
Всем спасибо, что откликнулись. Утро как всегда оказалось мудренее вечера. Вроде получилось.
Выложу здесь, может какому-нибудь дилетанту вроде меня пригодится. Когда искал готовый скрипт таймера по серверному времени ничего не нашел. var difference = new Date() - <?php echo time(); ?> * 1000; var enddate = difference + <?php echo strtotime('2020-01-01 20:50:50')*1000; ?>; function get_timer_223(string_223) {var date_new_223 = string_223; var date_t_223 = new Date(date_new_223); var date_223 = new Date(); var timer_223 = date_t_223 - date_223; if(date_t_223 > date_223) {var day_223 = parseInt(timer_223/(60*60*1000*24));if(day_223 < 10) {day_223 = "" + day_223;}day_223 = day_223.toString();var hour_223 = parseInt(timer_223/(60*60*1000))%24;if(hour_223 < 10) {hour_223 = "0" + hour_223;}hour_223 = hour_223.toString();var min_223 = parseInt(timer_223/(1000*60))%60;if(min_223 < 10) {min_223 = "0" + min_223;}min_223 = min_223.toString();var sec_223 = parseInt(timer_223/1000)%60;if(sec_223 < 10) {sec_223 = "0" + sec_223;}sec_223 = sec_223.toString(); timethis_223 = day_223 + " : " + hour_223 + " : " + min_223 + " : " + sec_223;$(".timerhello_223 div.result3 .result-day3").text(day_223);$(".timerhello_223 div.result3 .result-hour3").text(hour_223);$(".timerhello_223 div.result3 .result-minute3").text(min_223);$(".timerhello_223 div.result3 .result-second3").text(sec_223);}else {$(".timerhello_223 div.result3 .result-day3").text("00");$(".timerhello_223 div.result3 .result-hour3").text("00");$(".timerhello_223 div.result3 .result-minute3").text("00");$(".timerhello_223 div.result3 .result-second3").text("00");} }function getfrominputs_223(){ string_223 = new Date(enddate); get_timer_223(string_223);setInterval(function(){get_timer_223(string_223);},1000);}$(document).ready(function(){ getfrominputs_223();}); <span class="result-day3"></span> дней <span class="result-hour3"></span>:<span class="result-minute3"></span>:<span class="result-second3"></span> При тестировании на локалке не забывайте, что время меняется не только в браузере ) |
Цитата:
Причем тут миллисекунды, они вообще могут не учитываться, влияют только на точность, и если нужна таковая, используем. Добавление же миллисекунд к метке времени (timestamp) никоим образом не превращает ее в UTC да еще равное Гринвичу. Сервер физически может располагаться где угодно, а вот время по которому он будет работать определяется разработчиком, ему необходимым временем. И это никак не зависит от того на чем работает сервер - время нужно всем, РНР ни РНР, не важно, это же время устанавливается и для sql-сервера. Установка времени (параметр) не зависит от языка, это единое для всех, и определяется как например Europe/London, Europe/Moscow, хоть для РНР, хоть для JS. И это время есть время локальное, то есть если одновременно получить метки на сервере и клиенте, то они будут различны и отличаться как раз на разницу часовых поясов. При этом метка времени есть значение абсолютное, а разница часовых поясов есть значение со знаком. |
С современными скоростями погрешность минимальна. Чтоб уж совсем её сократить - получать текущее время сервера ajax-ом и запоминать время на клиенте когда readyState == 2, расхождение буде измеряться миллисекундами.)
|
Цитата:
В яваскрипт при переводе в ms => + new Date() - время в ms автопривязывается к гринвичу! Независимо от текущего часового пояса Сервер выдаёт в хидере тож переменную выдачи страницы с привязкой ко времени по Гринвичу Подсчитываемая разность меж временем клиента в ms и сервера и есть то расхождение по времени 2. миллисекунды слабо на что влияют(Выдаём переменую в секундах) ибо отображение на клиенте 23:59:59 10/06/2016 или 00:00:00 10/07/2017 имхо не критично, в случае попадания на границу суток |
Да тут вообще что-то всё перемешалось.)
Время в любом случае должно браться абсолютное, что в js что в php - это очевидно.) Я же говорил о способе синхронизации: пока скрипт на сервере отработает, пока до клиента дойдёт - уже кой-какой рассинхрон.) |
Aetae,
Да челу нужна дата до секунд я так понял, смысла учитывать эти мелкие погрешности нет Основная погрешность типично расхождение времени таймера на клиенте и на серве Это бывает достаточно часто при редком запуске компьютера или редком подключением к сети для автосинхронизации таймера службами операционки, или переезд в другой часовой пояс, не меняя настроек часового пояса в Операционке Достаточно считать дельту на входе каждой страницы, не заморачиваясь на какие-то API специальной синхронизации |
Часовой пояс GMT +3, время: 20:33. |