Как заставить работать скрипт по серверному времени ?
Здравствуйте
Как заставить эти 2 скрипта работать по серверному времени? В JS не селен, если можно ответы писать в более развернутом виде. Заранее спасибо. var delay_popup = 2000; var msg_pop = document.getElementById('msg_pop'); setTimeout("document.getElementById('msg_pop').style.display='block';document.getElementById('msg_pop').className += 'fadeIn';", delay_popup); <div id="msg_pop"> <span class="msg_close" onclick="document.getElementById('msg_pop').style.display='none'; return false;">X</span> <div id="countdown" ></div> <div id="countdown1" ></div> alert(<?php echo time() * 1000 ?> +'\n' + new Date()) var d = [5,4,3,2,1,0,7,6,]; var today = new Date(); var end = new Date(today.getFullYear(),today.getMonth(),today.getDate()+ d[today.getDay()], 15, 00, 00); var _second = 1000; var _minute = _second * 60; var _hour = _minute * 60; var _day = _hour * 24; var timer; function showRemaining() { var now = new Date(); var distance = end - now; if (distance < 0) { document.getElementById("countdown").innerHTML = "Следующий синхрон через неделю.";; return; } var days = Math.floor(distance / _day); var hours = Math.floor((distance % _day) / _hour); if (hours < 10) hours = '0' + hours; var minutes = Math.floor((distance % _hour) / _minute); if (minutes < 10) minutes = '0' + minutes; var seconds = Math.floor((distance % _minute) / _second); if (seconds < 10) seconds = '0' + seconds; document.getElementById('countdown1').innerHTML = "До начала синхрона осталось. "+ days +" дн. "+ hours +":"+ minutes +":"+ seconds +""; } timer = setInterval(showRemaining, 1000); <div id='relo' style="display: none; position: fixed; background-color: red; border: 1px solid lightblue; width: 250px; padding: 10px;bottom: 100px; right: 56px;border-radius: 12px;text-align: center;"><h2>Игра начинается!!!!<br><br><br> Страница обновится автоматически</h2></div> window.onload = function() { setInterval(function() { var date = new Date(); if (date.getDay()==5 && date.getHours()==15 && date.getMinutes()==00 && date.getSeconds()==03) { setTimeout ("$('#relo').show('drop');", 1000); setTimeout(" location.reload(true)", 5000 ); } },1000); }; |
Получить смещение серверного времени относительно utc и уже на основе этих данных корректировать клиентское время.
Не забудьте, что у клиента тоже есть определенное смещение относительно utc. |
Цитата:
|
ddro3doff, только если вы комментарии к коду добавите или объясните что хотите получить.
|
alert(<?php echo
|
<div id='relo' style="display: none; position: fixed; background-color: red; border: 1px solid lightblue; width: 250px; padding: 10px;bottom: 100px; right: 56px;border-radius: 12px;text-align: center;"><h2>Игра начинается!!!!<br><br><br> Страница обновится автоматически</h2></div> <script> window.onload = function() { setInterval(function() { var date = new Date(); if (date.getDay()==5 && date.getHours()==15 && date.getMinutes()==00 && date.getSeconds()==03)///В указанное время должно показаться div окно с текстом о перезагрузке страницы { setTimeout ("$('#relo').show('drop');", 1000); setTimeout(" location.reload(true)", 5000 ); } },1000); };</script> Смысл такой На сайте в указанное время должно появится окно с текстом о перезагрузке страницы и через 5 секунд страница должна перезагрузиться. Скрипт должен выполнятся 1 раз , только в пятницу и только в указанное время |
Цитата:
<script type="text/javascript"> var delay_popup = 2000; var msg_pop = document.getElementById('msg_pop'); setTimeout("document.getElementById('msg_pop').sty le.display='block';document.getElementById('msg_po p').className += 'fadeIn';", delay_popup); </script> <div id="msg_pop">// скрипт для скрытия див окна <span class="msg_close" onclick="document.getElementById('msg_pop').style. display='none'; return false;">X</span> <div id="countdown" ></div>/// окно с текстом при достижении указанного времени <div id="countdown1" ></div>/// окно с текстом если время еще не пришло <script> var d = [5,4,3,2,1,0,7,6,];/// определяет день недели "Пятница" - конечная дата для счетчика var today = new Date(); var end = new Date(today.getFullYear(),today.getMonth(),today.ge tDate()+ d[today.getDay()], 15, 00, 00);/ Время в которое должен показаться текст var _second = 1000; var _minute = _second * 60; var _hour = _minute * 60; var _day = _hour * 24; var timer; function showRemaining() { var now = new Date(); var distance = end - now; if (distance < 0) { document.getElementById("countdown").innerHTML = "Следующий синхрон через неделю.";;/// текст для окна countdown return; } var days = Math.floor(distance / _day); var hours = Math.floor((distance % _day) / _hour); if (hours < 10) hours = '0' + hours; var minutes = Math.floor((distance % _hour) / _minute); if (minutes < 10) minutes = '0' + minutes; var seconds = Math.floor((distance % _minute) / _second); if (seconds < 10) seconds = '0' + seconds; document.getElementById('countdown1').innerHTML = "До начала синхрона осталось. "+ days +" дн. "+ hours +":"+ minutes +":"+ seconds +"";///текст для окна countdown } timer = setInterval(showRemaining, 1000); </script> Отчет времени до события. Когда время события равно времени на сервер должен выводится текст. На сайте каждую пятницу в 19 00 проходит игра. Это напоминалка для пользователей сколько дней и часов осталось до игры. |
Цитата:
|
Цитата:
|
ddro3doff, уясните простую вещь (и хорошо бы для закрепления самому "пощупать" скриптом, что сие означает) - сервер возвращает временную зону западнее UTC как отрицательное число, а восточнее положительные. А клиент эти значения возвращает с противоположным знаком.
Отдавая страницу клиенту отдайте временную зону сервера, и суммируйте с временной зоной клиента: var tZ = <?=date('Z') * 1000?> + (new Date).getTimezoneOffset() * 60 * 1000; Вот на это нужно корректировать создание даты везде в скрипте, и все будет работать по времени сервера, по какому бы часовому поясу он не работал. |
Цитата:
|
А ваш сервер что по времени Якутска работает? Вы можете временную зону на севере установить любую. Можете и вообще ничего не передавать клиенту, на нем корректируйте сразу на московское время.
|
Цитата:
https://jsfiddle.net/jo9ch453/ |
ddro3doff, получил московское время: https://jsfiddle.net/od4cx0fb/
|
Цитата:
|
Цитата:
Вот пример http://vsmislie.ru/sinhron/ |
ddro3doff, если я правильно вас понял, то проблема в кривом времени толи сервера, толи клиента.
Можно сделать так (не тестировал): <head> <script>//Этот скрипт нужно вставить как можно раньше в страницу var SERVER_MOSCOW_TIMESTAMP=<?php echo time()-date('Z'); ?>*1000+180*60*1000; setTimeout(function tic(){ SERVER_MOSCOW_TIMESTAMP+=1000; setTimeout(tic,1e3); },1e3); </script> </head> <body> <script> //пример получения Московского серверного времени var moscowTime=new Date(SERVER_MOSCOW_TIMESTAMP); </script> </body> |
Цитата:
var today = new Date(); на var today =new Date(SERVER_MOSCOW_TIMESTAMP); Между head первым скриптом прописал <script>//Этот скрипт нужно вставить как можно раньше в страницу var SERVER_MOSCOW_TIMESTAMP=<?php echo time()-date('Z'); ?>*1000+180*60*1000; setTimeout(function tic(){ SERVER_MOSCOW_TIMESTAMP+=1000; setTimeout(tic,1e3); },1e3); </script> Не работает. Время вообще не выводится. |
Цитата:
В пятой строке "unexpected token <", открываем исходники страницы, смотрим пятую строку и что видим? php-код не исполнился, неправильно вставили. |
Цитата:
Можно указать на клиенте переменную - московскую часовую зону +3. Ибо опять, видимо, будет "революция" с переводом стрелок, что ранее отменили. А значит придется ручками "Москву переводить". А что в итоге вы хотите получить. Ну хорошо, таймер или чего-то, это не проблема, но ведь дата/время сервера то вообще не то будет. А в чем тогда смысл? |
laimas,
Цитата:
|
Цитата:
|
laimas, автору нужно получить серверное время в часовом поясе Москвы.
Самым простым способом было бы изменить временную зону сервера, но, видимо, автору это не подходит. Поэтому так. |
Цитата:
![]() ![]() |
ddro3doff, у вас php-код не исполнился.
|
Каждая ОС имеет механизм, который синхронизирует локальные часы с более надежным источником хронометража (таким как атомные часы NIST). Если это еще не сделано, настройте сервер для синхронизации его часов с одним из этих источников. В 99% у клиентов будет правильное время. Если вам нужна 100% точность, то продолжайте читать!
Цитата:
Вы можете получить с сервера времени(или со своего сервера) метку времени (UTC timestamp) и её передать в конструктор Date. Так вы получите точное время на тот момент. Пусть оно хранится в константе serverTime. Вам сразу же надо создать константу со временем на устройстве пользователя, например, пусть это будет clientTime. Вычислив разницу между двумя этими временами, вы узнаете на сколько отличается время клиента от точного! const now = serverDate.getTime() - clientDate.getTime(); Для того, чтобы получать впоследствии точное время, вам нужно прибавлять эту разницу ко времени клиента const date = new Date(Date.now() + now); Цитата:
Цитата:
И зачем вы пишете так, как будто у каждой временной зоны существует свой собственный timestamp? ddro3doff, нужно получить timestamp, когда начинается мероприятие(назовём его eventDate), вычислив eventDate - date вы получите, сколько времени осталось до события. Вот график, а вот решение https://jsfiddle.net/5ts70kr2/ (Там время берётся со стороннего сервера, но вы можете брать со своего!) |
Цитата:
|
Цитата:
Посмотрите скрипт, который я написал... https://jsfiddle.net/5ts70kr2/ Он работает, даже если пользователь относится к тем 1% о котором я писал выше! |
Цитата:
На сайте проходит игра "синхрон". Игра проходит каждую пятницу с 19 00 -19 50. Люди играют с разных стран и часовых поясов. Скрипт должен отсчитывать время до игры независимо от времени пользователя или его часового пояса. Ваш скрипт стоит на странице http://vsmislie.ru/. |
Цитата:
Цитата:
|
Цитата:
Что функция "time()" в php, что класс Date возвращают unix time с учетом смещения зоны. По факту получается, что не Лондон к Москве смещаем, а наоборот Москву к Лондону, чтобы получить GMT. |
Цитата:
|
Цитата:
document.getElementById("countdown1").innerHTML = `До начала синхрона осталось: ${days} дн. ${hours}:${minutes}:${seconds}`; Должно быть постоянным вне зависимости от времени на компьютере клиента. Вот страница на которой работает Ваш код http://vsmislie.ru/ |
Цитата:
|
Цитата:
|
Цитата:
|
Malleys,
if(dt > WEEK - 30 * MINUTE) { Я так понимаю что это сообщение будет показываться в течении 30 минут? Можно поменять на - 50 ? т.к игра идет 50 минут. |
Цитата:
Не знаю, в чём проблема... Цитата:
|
Цитата:
НЕ подскажите как сделать что бы этот скрипт работал по мск? <script> window.onload = function() { setInterval(function() { var date = new Date(); console.log(currentMoscowTime); if (date.getDay()==2 && date.getHours()==11 && date.getMinutes()==27 && date.getSeconds()==0) { setTimeout ("$('#fmin').show('drop');", 1000);; setTimeout( "$('#fmin').hide();", 9000); setTimeout ("$('#fminend').show('drop');", 60000); setTimeout( "$('#fminend').hide();", 9000); } },1000); };</script> |
Цитата:
В принципе он может работать по такой же схеме, как и выше приведённый мною скрипт! |
Часовой пояс GMT +3, время: 00:14. |