Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Часы с единым временем (https://javascript.ru/forum/server/64464-chasy-s-edinym-vremenem.html)

singmen 13.08.2016 14:44

Часы с единым временем
 
<script type="text/javascript">
 
function moscowTime() {
	var d = new Date();
	d.setHours( d.getHours() + 3, d.getMinutes() + d.getTimezoneOffset()  );
	return d.toTimeString().substring(0,8);
}
 
onload = function () {
  setInterval(function () {
    document.getElementById("txt").innerHTML = moscowTime();
  }, 100);
}
</script>


Хочу поставить часы на сайт, но чтобы у всех было единое время, использую код, но с ним такое не получается, как я понимаю препятствует new Date(); соотвественно если я на компе время поменяю, оно и там изменится, как этому можно препятствовать?

warren buffet 13.08.2016 14:50

Серверное время передавай.

singmen 13.08.2016 15:02

а поподробнее можно?

laimas 13.08.2016 15:18

singmen, если требуется синхронизировать чеса клиентов по времени сервера, то отдавайте в JS смещение временной зоны сервера, на которую корректировать смещение клиента - часы у клиентов будут идти по времени сервера. Как передать это смещение, зависит от серверного языка. На РНР, это так:

date("Z"); //в секундах со знаком

singmen 13.08.2016 15:40

сделал в таком виде:

<span id="vern_time">
<?
echo date("H").":"; 
echo date("i").":";
echo date("s");
 ?></span>

 <script>
setInterval(function () {$('#tm').load('/do/time.php #vern_time');}, 100);
</script>
<span id="tm"></span>


но получается таким образом я ддосю сервер, бывает за 6-12 секунд за раз прыгает

laimas 13.08.2016 16:20

Не так. Смещение временной зоны на клиенте возвращается в минутах, на сервере, если РНР, в секундах.

Если у вас РНР, отдавая страницу клиенту дописывайте в конце нее (перед закрывающим тегом body):

<script>var sZone = <?=date("Z") * 1000?></script>


Сервер и клиент возвращают смещение часового пояса с разными знаками по разную сторону от Гринвича. Поэтому плюсуя к смещению клиента смещение сервера получаем смещение на которое нужно скорректировать часы клиента, например:

var Zone = new Date().getTimezoneOffset() * 60 * 1000 + sZone;
var watch = new Date((new Date).getTime() + Zone); //время которое устанавливается в часах

laimas 13.08.2016 20:30

Цитата:

Сообщение от Rise
aimas соотвественно если он на компе часовой пояс поменяет, он и там изменится...

Вы живете по своей временной зоне или же меняете ее на иную? Пусть меняет на здоровье, время на часах при этом не поменяется. :)

Можно взять и таймштамп серверного времени, корректировать его каждую секунду, открывать дату по этому времени.

singmen,

<html>
<head>
</head>
<body>
<div id="times"></div>
<!--Contents-->
<script>//var zO = new Date().getTimezoneOffset() * 60 * 1000 + <?=date("Z") * 1000?>; //это должно быть реально в скрипте
var zO = new Date().getTimezoneOffset() * 60 * 1000 + 10800000; //а это для действующего примера, по Москве, удалить из реального скрипта
function watch() {
    var d = new Date((new Date).getTime() + zO), 
        t = d.getMinutes(),
        locale = 'ru-RU', 
        options = {year: 'numeric', month: 'long', day: 'numeric'};
    
    return {
        dY : d.getFullYear(), 
        dM : d.getMonth() + 1, 
        dD : d.getDate(), 
        sD : d.toLocaleDateString(locale, options), //локальное представление даты, поддержка locale и options: FF 29, IE 11, Opera 15, в Safari нет поддержки русской локали 
        tH : d.getHours(), 
        tM : t < 10 ? "0"+t : t, 
        tS : d.getSeconds()
    } 
}

function outTime() {
   var t = watch(); //объект значений текущего времени
   //выводим во что-то время
   document.getElementById('times').innerHTML = '<pre>' + t.sD + ' ' + t.tH + (t.tS & 1 ? ':' : ' ') + t.tM + '</pre>';
   setTimeout(outTime, 1000);   
}

outTime();
</script>
</body>
</html>

laimas 13.08.2016 20:54

Цитата:

Сообщение от Rise
Ну если бы не менялось тогда бы не было такой настройки наверное...

Как оно изменится? Пример выдает часы по московскому времени, у вас они по нему идут? И какой у вас часовой пояс?

laimas 13.08.2016 21:06

Цитата:

Сообщение от Rise
PS: в данном случае лучше вообще не использовать объект Date наверное чтобы никак не подкрутили

Что подкрутили? Часы корректируются на разность часового пояса сервера и клиента, пусть устанавливают на здоровье любой часовой пояс.

Если же нужна проверка чего-то от "накрутили", то нужны не просто часы на клиенте, а запрашивать у клиента его часовой пояс и делать проверку на сервере, ибо подкрутить можно что угодно, хоть используя Date, хоть математику с цифрами, и уж если на то пошло, то просто слать сервером без всякого клиента лабуду.
Ну это же не серьезно. )

laimas 13.08.2016 21:08

Цитата:

Сообщение от Rise
но речь же шла не о нем

А о чем? Какой тогда смысл заложен в едином для всех времени?

laimas 13.08.2016 21:33

Цитата:

Сообщение от Rise
Ну позвоните в другой часовой пояс и узнайте какое у них время и сравните с вашим не думаю что единое...

Я и без звонков знаю, что оно будет единое плюс/минус неточность хода часов у каждого клиента. Но для этого есть синхронизация времени по Интернету, посредством JS синхронизировать время вы не сможете. Работать по таймштамп сервера тоже секунда в секунду не получится, ибо запрос страницы тоже может быть с задержкой и приличной.

Сервер отдает смещение временных зон, расположенных западнее UTC как отрицательные числа, а расположенных восточнее UTC как положительные. У клиента же наоборот западные смещения положительные, а восточные отрицательные.

Смещение на которое корректируются часы, это "смещение клиента + смещение сервера", то есть при любом смещении получаем часы сервера. Точность определяется точностью часов на клиенте.

Проверяйте, совсем не сложно в примере вместо new Date().getTimezoneOffset() * 60 * 1000 подставляя все смещения для России, и используя таймшатам клиентский соответствующий этим смещениям, убедится, что время будет одно.

А вот контроль чего-то, если нужен, то это только на сервере.

singmen 14.08.2016 02:16

<div id="timeClock"></div>
<script language="JavaScript">
delta = new Date() - <? echo time()*1000 ?> ;
time = new Date();
function fulltime() {
time.setTime(new Date() - delta);
document.getElementById("timeClock").innerHTML = time.toLocaleString();
setTimeout('fulltime()',1000)
}
fulltime();
</script>


вот в таком виде сделал, все отлично, но вывод идет в виде: 14.08.2016, 1:16:10, как оставить на вывод только время?

singmen 14.08.2016 02:30

смог.
document.getElementById("timeClock").innerHTML = time.toTimeString().substring(0,8);

warren buffet 14.08.2016 07:46

Цитата:

Сообщение от laimas
синхронизировать чеса клиентов

Новое слово в русском языке и в программировании.

ТС, тебе всего лишь надо передать серверное время в long в скрипт один раз при загрузке страницы.

Какое это время будет - Московское или Мухосранское - не имеет значения, поскольку ты собираешься к нему привязывать часики на веб-странице. То есть локальное время юзера вообще не колебет по условиям задачи в первом сообщении.

Если тебе на сервере требуется московское время - ну так задай там зону для Europe/Moscow (я так думаю должно быть) и будет тебе по умолчанию город по умолчанию.

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

singmen 14.08.2016 12:34

<script language="JavaScript">
delta = new Date() - 1471166553000 ;
time = new Date();
function fulltime() {
time.setTime(new Date() - delta);
document.getElementById("timeClock").innerHTML = time.toTimeString().substring(0,8);

setTimeout('fulltime()',1000)
}
fulltime();
</script>


как оказалось, все равно действует по разному, т.е. если у меня не московское, то и им покажет не москву.

laimas 14.08.2016 12:51

Цитата:

Сообщение от warren buffet
надо передать серверное время в long в скрипт...
Какое это время будет - Московское или Мухосранское - не имеет значения

От придурок, а том что запрос страницы, ее открытие и рендеринг, это время, об этом ты не подумал?


singmen,
не пытайтесь подогнать под ответ - время сервера, это время клиента на плюс/минус разницу смещения часовых поясов сервера и клиента.

warren buffet 17.08.2016 10:17

Цитата:

Сообщение от laimas
не подумал?

Подумал что пофигу на секунды, а если у него минуту загружается, то выкинуть такой сайт в помойку. )))

warren buffet 17.08.2016 10:18

Типа юзеры такие созвонились и сверяют часики на его сайте: у меня на 3с отстают. - А у меня ажно на 5. - У меня тоже не точно московское, я протестил на яндексе. Капец блин сайт отстой, даже время одинаковое для всех не может показать.


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