Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как заставить работать скрипт по серверному времени ? (https://javascript.ru/forum/misc/77081-kak-zastavit-rabotat-skript-po-servernomu-vremeni.html)

ddro3doff 22.03.2019 15:32

Как заставить работать скрипт по серверному времени ?
 
Здравствуйте
Как заставить эти 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);
};

Nexus 22.03.2019 15:37

Получить смещение серверного времени относительно utc и уже на основе этих данных корректировать клиентское время.
Не забудьте, что у клиента тоже есть определенное смещение относительно utc.

ddro3doff 22.03.2019 15:41

Цитата:

Сообщение от Nexus (Сообщение 505201)
Получить смещение серверного времени относительно utc и уже на основе этих данных корректировать клиентское время.
Не забудьте, что у клиента тоже есть определенное смещение относительно utc.

Спасибо за ответ. Можно на примере этого кода показать как должно работать? просто уже третий день борюсь с этим уже голова кипит.

Nexus 22.03.2019 15:44

ddro3doff, только если вы комментарии к коду добавите или объясните что хотите получить.

laimas 22.03.2019 15:49

alert(<?php echo time() * 1000 ?> +'\n' + new Date()) - не time(), а date('z'), которое суммировать с часовым поясом клиента, и на результат которого корректировать создание даты new Date(). Сервер и клиент возвращают смещение с противоположными знаками, что и будет использовано при коррекции.

ddro3doff 22.03.2019 15:56

<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 раз , только в пятницу и только в указанное время

ddro3doff 22.03.2019 16:03

Цитата:

Сообщение от Nexus (Сообщение 505203)
ddro3doff, только если вы комментарии к коду добавите или объясните что хотите получить.





<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 22.03.2019 16:05

Цитата:

Сообщение от laimas (Сообщение 505204)
alert(<?php echo time() * 1000 ?> +'\n' + new Date()) - не time(), а date('z'), которое суммировать с часовым поясом клиента, и на результат которого корректировать создание даты new Date(). Сервер и клиент возвращают смещение с противоположными знаками, что и будет использовано при коррекции.

Эту строчку случайно скопировал, пробовал своими силами синхронизировать...... не получилось

ddro3doff 22.03.2019 16:11

Цитата:

Сообщение от Nexus (Сообщение 505203)
ddro3doff, только если вы комментарии к коду добавите или объясните что хотите получить.

В принципе все скрипты работают как нужно, токо по времени юзера, а мне нужно что бы таймер отсчитывал от серверного времени или от какого нибудь стороннего сервера.И вызывал всплывающие она тоже от серверного времени

laimas 22.03.2019 16:26

ddro3doff, уясните простую вещь (и хорошо бы для закрепления самому "пощупать" скриптом, что сие означает) - сервер возвращает временную зону западнее UTC как отрицательное число, а восточнее положительные. А клиент эти значения возвращает с противоположным знаком.

Отдавая страницу клиенту отдайте временную зону сервера, и суммируйте с временной зоной клиента:

var tZ = <?=date('Z') * 1000?> + (new Date).getTimezoneOffset() * 60 * 1000;


Вот на это нужно корректировать создание даты везде в скрипте, и все будет работать по времени сервера, по какому бы часовому поясу он не работал.


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