Часы с единым временем
<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(); соотвественно если я на компе время поменяю, оно и там изменится, как этому можно препятствовать? |
Серверное время передавай.
|
а поподробнее можно?
|
singmen, если требуется синхронизировать чеса клиентов по времени сервера, то отдавайте в JS смещение временной зоны сервера, на которую корректировать смещение клиента - часы у клиентов будут идти по времени сервера. Как передать это смещение, зависит от серверного языка. На РНР, это так:
date("Z"); //в секундах со знаком |
сделал в таком виде:
<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 секунд за раз прыгает |
Не так. Смещение временной зоны на клиенте возвращается в минутах, на сервере, если РНР, в секундах.
Если у вас РНР, отдавая страницу клиенту дописывайте в конце нее (перед закрывающим тегом body): <script>var sZone = <?=date("Z") * 1000?></script> Сервер и клиент возвращают смещение часового пояса с разными знаками по разную сторону от Гринвича. Поэтому плюсуя к смещению клиента смещение сервера получаем смещение на которое нужно скорректировать часы клиента, например: var Zone = new Date().getTimezoneOffset() * 60 * 1000 + sZone; var watch = new Date((new Date).getTime() + Zone); //время которое устанавливается в часах |
Цитата:
Можно взять и таймштамп серверного времени, корректировать его каждую секунду, открывать дату по этому времени. 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> |
Цитата:
|
Цитата:
Если же нужна проверка чего-то от "накрутили", то нужны не просто часы на клиенте, а запрашивать у клиента его часовой пояс и делать проверку на сервере, ибо подкрутить можно что угодно, хоть используя Date, хоть математику с цифрами, и уж если на то пошло, то просто слать сервером без всякого клиента лабуду. Ну это же не серьезно. ) |
Цитата:
|
Цитата:
Сервер отдает смещение временных зон, расположенных западнее UTC как отрицательные числа, а расположенных восточнее UTC как положительные. У клиента же наоборот западные смещения положительные, а восточные отрицательные. Смещение на которое корректируются часы, это "смещение клиента + смещение сервера", то есть при любом смещении получаем часы сервера. Точность определяется точностью часов на клиенте. Проверяйте, совсем не сложно в примере вместо new Date().getTimezoneOffset() * 60 * 1000 подставляя все смещения для России, и используя таймшатам клиентский соответствующий этим смещениям, убедится, что время будет одно. А вот контроль чего-то, если нужен, то это только на сервере. |
<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, как оставить на вывод только время? |
смог.
document.getElementById("timeClock").innerHTML = time.toTimeString().substring(0,8); |
Цитата:
ТС, тебе всего лишь надо передать серверное время в long в скрипт один раз при загрузке страницы. Какое это время будет - Московское или Мухосранское - не имеет значения, поскольку ты собираешься к нему привязывать часики на веб-странице. То есть локальное время юзера вообще не колебет по условиям задачи в первом сообщении. Если тебе на сервере требуется московское время - ну так задай там зону для Europe/Moscow (я так думаю должно быть) и будет тебе по умолчанию город по умолчанию. Смещения "чесав" для пользователя требуется лишь в том случае, когда тебе надо привязать его локальное время к серверному, чтобы, например понять когда у него ночь, а когда день, когда утро, когда время чистить зубки и спать. |
<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> как оказалось, все равно действует по разному, т.е. если у меня не московское, то и им покажет не москву. |
Цитата:
singmen, не пытайтесь подогнать под ответ - время сервера, это время клиента на плюс/минус разницу смещения часовых поясов сервера и клиента. |
Цитата:
|
Типа юзеры такие созвонились и сверяют часики на его сайте: у меня на 3с отстают. - А у меня ажно на 5. - У меня тоже не точно московское, я протестил на яндексе. Капец блин сайт отстой, даже время одинаковое для всех не может показать.
|
Часовой пояс GMT +3, время: 21:06. |