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;


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

ddro3doff 26.03.2019 09:06

Цитата:

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

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

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


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

Спасибо за ответ. А как сделать что бы время бралось по МСК а не по серверу?

laimas 26.03.2019 09:45

А ваш сервер что по времени Якутска работает? Вы можете временную зону на севере установить любую. Можете и вообще ничего не передавать клиенту, на нем корректируйте сразу на московское время.

ddro3doff 26.03.2019 10:48

Цитата:

Сообщение от laimas (Сообщение 505467)
А ваш сервер что по времени Якутска работает? Вы можете временную зону на севере установить любую. Можете и вообще ничего не передавать клиенту, на нем корректируйте сразу на московское время.

У меня сервер работает по Украинскому времени + перевод часов. А мне нужно отчет времени от мск. Не злитесь , я в JS практически ничего не понимаю. Можете помочь мне с кодом?
https://jsfiddle.net/jo9ch453/

Nexus 26.03.2019 10:58

ddro3doff, получил московское время: https://jsfiddle.net/od4cx0fb/

ddro3doff 26.03.2019 10:59

Цитата:

Сообщение от Nexus (Сообщение 505481)
ddro3doff, получил московское время: https://jsfiddle.net/od4cx0fb/

Огромное спасибо!

ddro3doff 26.03.2019 11:58

Цитата:

Сообщение от Nexus (Сообщение 505481)
ddro3doff, получил московское время: https://jsfiddle.net/od4cx0fb/

Не работает( Время считает от компьютерного времени.
Вот пример http://vsmislie.ru/sinhron/

Nexus 26.03.2019 12:16

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>

ddro3doff 26.03.2019 13:17

Цитата:

Сообщение от Nexus (Сообщение 505496)
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>


Не работает. Время вообще не выводится.

Nexus 26.03.2019 13:26

Цитата:

Сообщение от ddro3doff
Не работает. Время вообще не выводится.

Ну так консоль откройте и посмотрите в чем причина.
В пятой строке "unexpected token <", открываем исходники страницы, смотрим пятую строку и что видим?
php-код не исполнился, неправильно вставили.

laimas 26.03.2019 13:32

Цитата:

Сообщение от ddro3doff
SERVER_MOSCOW_TIMESTAMP=<?php echo time()-date('Z'); ?>*1000+180*60*1000

Нифига себе, а зачем?

Можно указать на клиенте переменную - московскую часовую зону +3. Ибо опять, видимо, будет "революция" с переводом стрелок, что ранее отменили. А значит придется ручками "Москву переводить".

А что в итоге вы хотите получить. Ну хорошо, таймер или чего-то, это не проблема, но ведь дата/время сервера то вообще не то будет. А в чем тогда смысл?

Nexus 26.03.2019 13:36

laimas,
Цитата:

Сообщение от laimas
а зачем?

Что именно?

laimas 26.03.2019 13:38

Цитата:

Сообщение от Nexus
Что именно?

Этак арифметика?

Nexus 26.03.2019 13:43

laimas, автору нужно получить серверное время в часовом поясе Москвы.
Самым простым способом было бы изменить временную зону сервера, но, видимо, автору это не подходит.
Поэтому так.

ddro3doff 26.03.2019 13:44

Цитата:

Сообщение от Nexus (Сообщение 505503)
Ну так консоль откройте и посмотрите в чем причина.
В пятой строке "unexpected token <", открываем исходники страницы, смотрим пятую строку и что видим?
php-код не исполнился, неправильно вставили.

Вставил сразу после <head>


Nexus 26.03.2019 13:45

ddro3doff, у вас php-код не исполнился.

Malleys 26.03.2019 13:50

Каждая ОС имеет механизм, который синхронизирует локальные часы с более надежным источником хронометража (таким как атомные часы NIST). Если это еще не сделано, настройте сервер для синхронизации его часов с одним из этих источников. В 99% у клиентов будет правильное время. Если вам нужна 100% точность, то продолжайте читать!

Цитата:

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

Т. е. вам нужно, чтобы время клиента было точным!

Вы можете получить с сервера времени(или со своего сервера) метку времени (UTC timestamp) и её передать в конструктор Date. Так вы получите точное время на тот момент. Пусть оно хранится в константе serverTime. Вам сразу же надо создать константу со временем на устройстве пользователя, например, пусть это будет clientTime.

Вычислив разницу между двумя этими временами, вы узнаете на сколько отличается время клиента от точного!
const now = serverDate.getTime() - clientDate.getTime();


Для того, чтобы получать впоследствии точное время, вам нужно прибавлять эту разницу ко времени клиента
const date = new Date(Date.now() + now);


Цитата:

Сообщение от laimas
Сервер и клиент возвращают смещение с противоположными знаками

Какой ужас! Я всё ни как не пойму, зачем вам вообще Лондон сдвигать в Москву...

Цитата:

Сообщение от Nexus
ddro3doff, получил московское время: https://jsfiddle.net/od4cx0fb/

Зачем вы меняете timestamp? У вас получилось по пятницам в 16 в Москве (GMT+3), или в 19, но в Бангладеше (GMT+6), (это одно и тоже время!) UPD[И от того, с какого часового пояса смотреть тоже отличается!]

И зачем вы пишете так, как будто у каждой временной зоны существует свой собственный timestamp?

ddro3doff, нужно получить timestamp, когда начинается мероприятие(назовём его eventDate), вычислив eventDate - date вы получите, сколько времени осталось до события. Вот график, а вот решение https://jsfiddle.net/5ts70kr2/ (Там время берётся со стороннего сервера, но вы можете брать со своего!)

ddro3doff 26.03.2019 14:00

Цитата:

Сообщение от Malleys (Сообщение 505513)
Каждая ОС имеет механизм, который синхронизирует локальные часы с более надежным источником хронометража (таким как атомные часы NIST). Если это еще не сделано, настройте сервер для синхронизации его часов с одним из этих источников. В 99% у клиентов будет правильное время. Если вам нужна 100% точность, то продолжайте читать!

Т. е. вам нужно, чтобы время клиента было точным!

Вы можете получить с сервера времени(или со своего сервера) метку времени (UTC timestamp) и её передать в конструктор Date. Так вы получите точное время на тот момент. Пусть оно хранится в константе serverTime. Вам сразу же надо создать константу со временем на устройстве пользователя, например, пусть это будет clientTime.

Вычислив разницу между двумя этими временами, вы узнаете на сколько отличается время клиента от точного!
const now = serverDate.getTime() - clientDate.getTime();


Для того, чтобы получать впоследствии точное время, вам нужно прибавлять эту разницу ко времени клиента
const date = new Date(Date.now() + now);


Какой ужас! Я всё ни как не пойму, зачем вам вообще Лондон сдвигать в Москву...

Зачем вы меняте timestamp? У вас получилось по пятницам в 16 в Москве (GMT+3), или в 19, но в Бангладеше (GMT+6), (это одно и тоже время!)

И зачем вы пишете так, как будто у каждой временной зоны существует свой собственный timestamp?

ddro3doff, нужно получить timestamp, когда начинается мероприятие(назовём его eventDate), вычислив eventDate - date вы получите, сколько времени осталось до события. Вот график, а вот решение https://jsfiddle.net/5ts70kr2/ (Там время берётся со стороннего сервера, но вы можете брать со своего!)

Поменял часовой пояс на компьютере на +6 , время отчета в скрипте тоже уменьшилось на 3 часа. НЕ работает(

Malleys 26.03.2019 14:11

Цитата:

Сообщение от ddro3doff
часовой пояс на компьютере на +6

Вы живёте в где-то около Индии или в Бангладеше?

Посмотрите скрипт, который я написал... https://jsfiddle.net/5ts70kr2/ Он работает, даже если пользователь относится к тем 1% о котором я писал выше!

ddro3doff 26.03.2019 14:14

Цитата:

Сообщение от Malleys (Сообщение 505518)
Вы живёте в где-то около Индии или в Бангладеше?

Посмотрите скрипт, который я написал... https://jsfiddle.net/5ts70kr2/ Он работает, даже если пользователь относится к тем 1% о котором я писал выше!

Я наверно не верно описал что должен делать скрипт.
На сайте проходит игра "синхрон". Игра проходит каждую пятницу с 19 00 -19 50. Люди играют с разных стран и часовых поясов. Скрипт должен отсчитывать время до игры независимо от времени пользователя или его часового пояса. Ваш скрипт стоит на странице http://vsmislie.ru/.

Malleys 26.03.2019 14:17

Цитата:

Сообщение от ddro3doff
Игра проходит каждую пятницу с 19 00 -19 50.

По какому времени? Если по московскому, то скрипт именно делает то, что вы хотите!
Цитата:

Сообщение от ddro3doff
Скрипт должен отсчитывать время до игры независимо от времени пользоватея или его часового пояса.


Nexus 26.03.2019 14:17

Цитата:

Сообщение от Malleys
Я всё ни как не пойму, зачем вам вообще Лондон сдвигать в Москву...

Не понял.
Что функция "time()" в php, что класс Date возвращают unix time с учетом смещения зоны.
По факту получается, что не Лондон к Москве смещаем, а наоборот Москву к Лондону, чтобы получить GMT.

ddro3doff 26.03.2019 14:18

Цитата:

Сообщение от Malleys (Сообщение 505522)
По какому времени? Если по московскому, то скрипт именно делает то, что вы хотите!

Да по мск. +3

ddro3doff 26.03.2019 14:26

Цитата:

Сообщение от Malleys (Сообщение 505522)
По какому времени? Если по московскому, то скрипт именно делает то, что вы хотите!

Но если я меняю часовой пояс на компьютере почему время отчета скрипта меняется? Ведь конечное время должно отсчитываться от стороннего сервера , как написано у Вас в скрипте.
document.getElementById("countdown1").innerHTML =
				`До начала синхрона осталось: ${days} дн. ${hours}:${minutes}:${seconds}`;

Должно быть постоянным вне зависимости от времени на компьютере
клиента.
Вот страница на которой работает Ваш код http://vsmislie.ru/

Malleys 26.03.2019 14:30

Цитата:

Сообщение от ddro3doff
Но если я меняю часовой пояс на компьютере почему время отчета скрипта меняется?

Не знаю, может быть вы открыли страницу, затем поменяли часовой пояс 😱, а затем посмотрели на страницу. Тогда стоит обновить страницу!

ddro3doff 26.03.2019 14:32

Цитата:

Сообщение от Malleys (Сообщение 505527)
Не знаю, может быть вы открыли страницу, затем поменяли часовой пояс ????, а затем посмотрели на страницу. Тогда стоит обновить страницу!

Можете проверить сами ? адрес я вам указал сообщение выше.

ddro3doff 26.03.2019 14:36

Цитата:

Сообщение от Malleys (Сообщение 505527)
Не знаю, может быть вы открыли страницу, затем поменяли часовой пояс ????, а затем посмотрели на страницу. Тогда стоит обновить страницу!

Простите , моя вина.... Все заработало. Огромное Спасибо!!!!!

ddro3doff 26.03.2019 14:39

Malleys,
if(dt > WEEK - 30 * MINUTE) {
Я так понимаю что это сообщение будет показываться в течении 30 минут?
Можно поменять на - 50 ? т.к игра идет 50 минут.

Malleys 26.03.2019 14:41

Цитата:

Сообщение от Malleys
Не знаю, может быть вы открыли страницу, затем поменяли часовой пояс ????, а затем посмотрели на страницу. Тогда стоит обновить страницу!

Я предположил, но оно так себя не ведёт нигде!
Не знаю, в чём проблема...


Цитата:

Сообщение от ddro3doff
Я так понимаю что это сообщение будет показываться в течении 30 минут?

Да, вы правы!

ddro3doff 26.03.2019 14:43

Цитата:

Сообщение от Malleys (Сообщение 505533)
Не знаю, в чём проблема...

Да, вы правы!

Спасибо еще раз.
НЕ подскажите как сделать что бы этот скрипт работал по мск?
<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>

Malleys 26.03.2019 14:46

Цитата:

Сообщение от ddro3doff
НЕ подскажите как сделать что бы этот скрипт работал по мск?

Это отдельный скрипт, или он на той же странице?


В принципе он может работать по такой же схеме, как и выше приведённый мною скрипт!


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