Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   получить время с сервера (https://javascript.ru/forum/css-html/31900-poluchit-vremya-s-servera.html)

Саша82 25.09.2012 15:00

получить время с сервера
 
Как сделать чтобы отображалось в браузере время, но только время бралось не с моего компа а из сервера на котором находится страничка.
<INPUT type="text" ID='cl3' size=28 value="" style="color: #FFFF00; font-family: Courier New; font-size: 12pt; border: 1px solid #D90000; background-color: #732501" name="vd">
<SCRIPT>
function clock3(){
var d=new Date()
return d.toLocaleDateString()+" "+d.toLocaleTimeString()
}
setInterval("document.all.cl3.value=clock3()",500) // обновление показаний часов
</SCRIPT>

ksa 25.09.2012 15:17

Цитата:

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

Вариант на csp...

<html>
<head>
</head>
<body>
<p>Серверное время - #($zt($p($h,",",2)))#</p>
</body>
</html>

Саша82 25.09.2012 15:43

незнаю что такое csp , пример вставил в браузер нечего не показывает

trikadin 25.09.2012 15:48

Цитата:

Сообщение от Саша82
незнаю что такое csp , пример вставил в браузер нечего не показывает

Молодец, так всегда и делай. И ты станешь самым великим программистом в мире.

Прямо точной синхронизации тебе добиться вряд ли удастся, но есть вариант, скажем, синхронизировать время AJAX-ом. Т.е., ты делаешь запрос, который возвращает тебе текущее время сервера (желательно, в юникс-формате). Потом ты прибавляешь к этому ответу время, которое ушло на его получение, и получаешь почти точное значение времени сервера.

Саша82 25.09.2012 16:12

незнаю как это сделать помогите плз, тут ведь знающему делов на одну минуту если не меньше

Саша82 25.09.2012 18:42

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

<INPUT type="text" ID='cl3' size=28 value="" style="color: #FFFF00; font-family: Courier New; font-size: 12pt; border: 1px solid #D90000; background-color: #732501" name="vd">
<script type="text/javascript">
function clock3(){
var d=new Date(<?php print time(); ?> * 1000)
return d.toLocaleDateString()+" "+d.toLocaleTimeString()
}
setInterval("document.all.cl3.value=clock3()",500) // обновление показаний часов
</SCRIPT>

dmitriymar 25.09.2012 21:55

Цитата:

Сообщение от Саша82
но время стоит на месте

время никогда не стоит на месте:)

walik 25.09.2012 22:37

Цитата:

Сообщение от Саша82
а как сделать чтобы время шло

Цитата:

Сообщение от trikadin
синхронизировать время AJAX-ом. Т.е., ты делаешь запрос, который возвращает тебе текущее время сервера (желательно, в юникс-формате). Потом ты прибавляешь к этому ответу время, которое ушло на его получение, и получаешь почти точное значение времени сервера

...

Саша82 26.09.2012 15:55

сам алгоритм я понимаю как должен быть построен а вот само решение немогу сделать. напишите хоть ктото. я джаву оочень плохо знаю

Саша82 26.09.2012 19:30

так и не дождался ответа, на другом форуме помогли, вот как это должно было выглядеть. МОЖНТ КОМУ ТО ПРИГОДИТСЯ Я ЖЕ НЕ ЖЛОБ.
ГОТОВОЕ РЕШЕНИЕ
<?
echo date( 'Y-г m-м d-ч ', time() );
?>
<b id="seconds">0</b>

<script Language="JavaScript">
var hours = <?php echo date("H"); ?>;
var min = <?php echo date("i"); ?>;
var sec = <?php echo date("s"); ?>;
function display() {
sec+=1;
if (sec>=60)
{
min+=1;
sec=0;
}
if (min>=60)
{
hours+=1;
min=0;
}
if (hours>=24)
hours=0;


if (sec<10)
sec2display = "0"+sec;
else
sec2display = sec;


if (min<10)
min2display = "0"+min;
else
min2display = min;

if (hours<10)
hour2display = "0"+hours;
else
hour2display = hours;

document.getElementById("seconds").innerHTML = hour2display+":"+min2display+":"+sec2display;
setTimeout("display();", 1000);
}

display();
</script>

Aetae 26.09.2012 20:57

Уродливое, кривое решение через жопу. А главное - нерабочее.
Уже через 5-10 минут использования сайта появятся серьёзные расхождения в дате, т.к. setTimeout не гарантирует, что следующий запуск будет точно через секунду, он гарантирует только то что запуск будет не раньше чем через секунду. Малейшее подтормаживание и таймер сбит.

Делать надо как-то так было:
<b id="seconds">00:00:00</b>
<script type="text/javascript">
(function(){
	var difference = <?php echo time() ?>*1000 - new Date(), //сразу вычисляем разницу между серверным временем и временем на клиенте
		block = document.getElementById("seconds");
	(function redraw(){
		var date = new Date(); //получаем текущую дату клиента
		date.setTime( date.getTime() + difference); //прибавляем разницу
		block.innerHTML = date.toTimeString().substring(0,8); //форматируем и выводим
		setTimeout(redraw, 1000); //запускаем таймер на повтор функции
	}())
}())
</script>

Aetae 26.09.2012 21:15

Щито? Насколько я понимаю php echo сразу выдаётся в поток, script тоже обрабатывается в потоке, т.е. переменная differece появляется практически сразу и лаг не должен составить и пары миллисекунд. А вот с ajax всё вилами по воде писано.

Aetae 26.09.2012 21:43

Вы ещё tcp пакеты посчитайте.)
Я в php не знаток, но вроде как если специально не включена функция буффера все echo отправляются клиенту сразу без накопления.

В любом случае ajax гараздо менее надёжен в плане лага.

Aetae 26.09.2012 23:52

Ajax это в любом случае дополнительный запрос, что даёт огромный простор для лагов. Далее событийная модель опятьже добавляет задержку...

Santehnick 09.03.2013 15:47

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

danik.js 09.03.2013 16:56

Думаю через xhr-запрос можно точнее синхронизировать время. Так мы можем узнать общее время пинга, и поделив его пополам - примерную задержку на доставку ответа от сервера.

Santehnick 09.03.2013 17:13

Цитата:

Сообщение от danik.js (Сообщение 239633)
Думаю через xhr-запрос можно точнее синхронизировать время. Так мы можем узнать общее время пинга, и поделив его пополам - примерную задержку на доставку ответа от сервера.

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

Santehnick 09.03.2013 17:30

var baseTime = <?php echo time() * 1000 ?>;
var startTime = new Date().getTime();
var UTC = 4;
	
function redraw(){
	var date = new Date() - startTime;
	var time = baseTime + date;
	
	var d = new Date(time);

	d.setUTCHours(d.getUTCHours() + UTC);
	$('.clock').html(d.toUTCString().substring(16, 25));
	
	setTimeout("redraw()", 1000); //запускаем таймер на повтор функции
}


$(document).ready(function()
{
	redraw();
});


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

dmitriymar 09.03.2013 23:13

получение времени с сервера.
а на сервере установлен сервер времени? нет ?
- "ручная" синхронизация с любым временем может отпасть после любой проблемы

синхронизация на клиенте с мировым
виндовс служба времени включена ?(по умолчанию нет)
-нет? не то что локальное, "мировое" из биоса поднимается - вероятность правильного низкая .

пинг делить на 2? -без службы времени в винде погрешность около 15 мс на вычисления

Роман1966 10.01.2015 08:46

Саша82, спасибо!

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

Сервер халявный, связи с админом практически нет, приходится вставлять костыли, так как время сервера неверное, да ещё гуляет.
Повесил часики на гостевой, мне ребята позвонят если сильно отстают, а я забываю иногда сверять. А на стоячее время никто внимания не обратит.

Артист 08.01.2017 19:34

Что-то ругается на скобки:

alert(<?php echo time() * 1000 ?> +'\n' + new Date())

AngelW 10.01.2017 23:32

Спасибо за решение
 
а помошникам стыд и срам.... от их заумства они не выглядят умными

АндрейD 22.05.2020 14:57

Это на сервере
<?php
echo date('H:i:s d.m.Y');
?>

Код js, посылающий каждую секунду ajax запрос
let test = document.querySelector('#test');
document.addEventListener('DOMContentLoaded', () => {
window.setInterval(timer, 1000);
});
async function timer() {
let promise = await fetch('/ajax.php/');
let data = await promise.text();
test.innerHTML = data;
}

laimas 22.05.2020 15:10

Цитата:

Сообщение от АндрейD
Код js, посылающий каждую секунду ajax запрос

Зачем? Клиенту достаточно знать часовой пояс сервера все остальное это клиентское время с разницей часовых поясов.

Aetae 22.05.2020 15:27

laimas, а вдруг у клиента на компьютере часы идут неправильно? :lol:

P.S. На самом деле на компьютере часы таки могут идти неправильно, сам лично столкнулся с этим когда в ноутбуке сдохал батарейка CMOS - часы отставали за час на ~5-10 минут. Но это слишком уникальная ситуация чтоб о ней заботиться.)

laimas 22.05.2020 15:44

Цитата:

Сообщение от Aetae
а вдруг у клиента на компьютере часы идут неправильно?

Это проблемы не сервера, а клиента, и заметить их несложно, да и синхронизацию часов никто не отменял. :)

Malleys 22.05.2020 17:56

laimas, а если нужно точное время? Читай далее...

АндрейD, достаточно получить время один раз, все остальные времена вычисляются на его основе.

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

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



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

laimas 22.05.2020 18:03

Цитата:

Сообщение от Malleys
а если нужно точное время? Читай далее...

И чем это отличается от времени клиента скорректированного на разницу часовых поясов?

Malleys 22.05.2020 18:16

Цитата:

Сообщение от laimas
И чем это отличается от времени клиента скорректированного на разницу часовых поясов?

У некоторых людей такое будет отличаться ещё в среднем на ±5 секунды.

laimas 22.05.2020 18:26

Цитата:

Сообщение от Malleys
У некоторых людей такое будет отличаться ещё в среднем на ±5 секунды.

Сам вопрос "а если нужно точное время?" настолько же абсурден как и довод в 5 секунд. Не может быть время сервера точнее времени клиента и наоборот, весь земной шарик живет по единому времени, которое различно на разницу часовых поясов. UTC как раз это и отражает.

Если у клиента разница в 5 секунд, то это нерадивый клиент, если у сервера ошибка в 5 секунд, то это нерадивый сервер, если у обоих ошибка, то нерадивы оба. Но причем тут время, часовые пояса и т.д.?

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

Все остальное, это болтовня.

Malleys 22.05.2020 18:41

Цитата:

Сообщение от laimas
Если у клиента разница в 5 секунд, то это нерадивый клиент

Я подмигну тебе правым правым глазиком, и ещё раз; ты ведь знаешь некоторые причины, почему это не так!

Цитата:

Сообщение от laimas
Все остальное, это болтовня.

Я скорей ожидал, что ты предъявишь претензию, как так возможно написать clientDate.getTime();
или Date.now() — ведь это брешь, не было бы более безопасней использовать performance.now()? Браво! Ты полностью и безоговорочно доверяешь своим клиентам!

laimas 22.05.2020 18:55

Несешь какую-то пургу, слово UTC метка на компьютере получается не от системных часов, а специальным запросом непосредственно от эталонных атомных часов. Что за бред.

Точность хода системного времени в первую очередь зависит от качества кварцевого резонатора. Если на моей материнской плате применены компоненты применяемые в военной технике, то она и качественная, и надежная. За много лет эксплуатации я даже батарейку CMOS еще не разу не менял. Ту точность времени, которую обеспечивают ее компоненты, она и поддерживает. Кроме этого системное время синхронизируется с сигналами точного времени. Разница в 5 секунд может быть только у того, кто часов не наблюдает, то есть у счастливых.

Более месяца назад я купил смарт часы. Посмотрел, проверил, настроил и положил. Сегодня решил, что пора завтра сходить и поставить в конце концов симку на них, чтобы использовать по назначению. Аккумулятор разряжен сильно, это раз, компоненты этих часов, это конечно куда ниже по уровню точности чем на МП, это два, все это вкупе обеспечивало отставание на 3 минуты за это время. Достаточно было синхронизировать время по сети и все.

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

Malleys 22.05.2020 19:41

Цитата:

Сообщение от laimas
доверять кому и чему хочешь, мне пофигу, только не вешай мне лапшу на уши.

Я как раз таки считаю, что нельзя доверять никакому вводу пользователя!

Цитата:

Сообщение от laimas
Разница в 5 секунд может быть только у того, кто часов не наблюдает, то есть у счастливых.

Цитата:

Сообщение от laimas
все это вкупе обеспечивало отставание на 3 минуты за это время. Достаточно было синхронизировать время по сети и все.

Потому что это для тебя важно, чтобы часы шли точно до секунд (т. е. ты не счастлив?), однако не все такими проблемами заморачиваются, и там могут быть различия не только в среднем ±5 секунд.

Некие две девушки вообще вручную синхронизировали часы на телефоне, чтобы придти потом по времени, которое принято в заведении! И некоторые вообще не доверяют таким вещам, как автоматическое обновление времени и настраивают по наручным механическим часам!

Некоторые вообще просто так крутят время вперед-назад, потому что в некоторых играх начинают происходить интересные вещи!

Цитата:

Сообщение от laimas
Несешь какую-то пургу, слово UTC метка на компьютере получается не от системных часов

Нет, это у тебя некие идеалистические представления о людях, а я знаю, что не у всех UTC метка на компьютере получена от эталонных атомных часов!

Цитата:

Сообщение от laimas
только не вешай мне лапшу на уши.

Цитата:

Сообщение от laimas
Несешь какую-то пургу

Понятно, что Date.now() и тому подобное может быть легко изменено ручным изменением или программно, а как думаешь performance.now() безопасно использовать?

laimas 22.05.2020 19:55

Любишь ты попусту языком чесать, поэтому иногда и опускаешься до бредятины. Я же не любитель пустых разговоров.

Malleys 22.05.2020 20:53

Цитата:

Сообщение от laimas
поэтому иногда и опускаешься до бредятины

Такая проблема возникала не только у меня!

https://stackoverflow.com/questions/...cause-problems

А то, что нельзя получив однажды точное время от сервера в дальнейшем получать точное время высчитывая его при помощи Date.now() видно из этого примера...
setInterval(() => console.log(Date.now(), performance.now()), 500)
Стоит лишь поменять системное время, и всё поломается! Однако у performance.now() такой проблемы нет!

Цитата:

Сообщение от laimas
Любишь ты попусту языком чесать,

Ох, да, тебе, как человеку, который делает формочки с картинками, проблемы точного времени неведомы! Там есть проблема, просто ты с ними не сталкивался и смутно представляешь, о чём речь!


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