Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > использование часов со смещением


Автор: z-END 28.8.2007, 18:26
Вообщем мне нужно показывать время установленное на сервере
я сделал так:
1. вывод данных для скрипта в пхп:
Код

echo "
var TimeHour=$hour;
var TimeMin=$min;
var TimeSec=$sec;
"


2. скрипт отображающий время в окошке..
Код

function ShowTime(){
    TimeSec++;
    if (TimeSec>59) {TimeSec=0;TimeMin++;}
    if (TimeMin>59) {TimeMin=0;TimeHour++;}
    if (TimeHour>23) TimeHour=0;
    
TimeMin)  + ":" + ((TimeSec<=9) ? "0"+TimeSec : TimeSec);
    time = ((TimeHour<=9) ? "0"+TimeHour : TimeHour) + ":" + ((TimeMin<=9) ? "0"+TimeMin : TimeMin);
    if (showedtime!=time) {
        obj=document.getElementById('ClockArea');
        if (!obj) return;
        showedtime=time;
        obj.innerHTML=time;
    }
    setTimeout("ShowTime()", 1000);
}



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

Автор: dXdYdZ 28.8.2007, 23:50
Так оно правильно работать не будет (будет или спешить, или отставать).
Необходимо просто:
1) С помощью JavaSCript Получить время в браузере
2) Получить время с сервера
3) С помощью JavaScript вычислить разницу между временем в браузере и на сервере
4) Постоянно выводить время с учётом разницы

Автор: dXdYdZ 29.8.2007, 01:18
А задачка не такая простая, как кажется на первый взгляд. Вот код:
Код

echo "
var sec=$sec;
var min=$min;
var hour=$hour;
";

Код

load=function()
{
var clientTime=new Date();
var serverDate=new Date(0,0,0,hour,min,sec);
var delta=serverDate-clientTime;
showTime=function()
    {
    document.getElementById('ClockArea').innerHTML=(new Date((new Date()).getTime()+delta)).toLocaleTimeString();
    }
setInterval("showTime()", 1000);
}

Функцию load надо вызвать в document.body.onload.

Автор: z-END 29.8.2007, 10:54
здоровоsmile

Добавлено через 1 минуту и 31 секунду
а вот еще вопрос в догонку... насчет использования кнопки "назад" 
в этом случае время станет неточным... я тут подумал а если каждую секунду записывать время в куку и оттуда счтывать, так мы ведь победим сброс времени?

Автор: Ghirik 29.8.2007, 10:57
Согласен, я то же не знал, что так вот времячко выводят... smile 

Автор: dXdYdZ 29.8.2007, 13:03
Цитата

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

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

Автор: 12345c 29.8.2007, 17:48
dXdYdZ, я этим занимался, вот статья (пока недоступна) с рабочим кодом: 

Код
<p>Работающий скрипт:</p>

<U>Местное время клиента:</U> <span id=timeK></span><br>
<U>Время сервера с переводом на зону клиента:</U> <span id=time></span><br>
<U>Местное время сервера:</U> <span id=timeS></span><br>

<script>d=document;
    Dphp=<?=gmmktime()?>*1000;//Гринв.вр.сервера в миллисекундах
    dServM=<?=date('Z')/60?>;
      //Если пишется без пхп, заменить выражение числом 1131037423000 ,это будет 17:03 для MSK
      d.write('Начальное время сервера: '+(new Date(Dphp))+'<br>');
    Djs=(D=new Date()).getTime()-D.getTimezoneOffset()*60000; //Гринв.вр.клиента в миллисекундах 
      d.write('Начальное время клиента: '+(new Date(Djs))+'<br>');
    DD=Dphp-Djs;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
      d.write('Часовой пояс сервера: '+dServM+'<br>');
    dKlientM=-(new Date()).getTimezoneOffset();
      d.write('Часовой пояс клиента: '+dKlientM+'<br>');
    DPoyas=(dServM-dKlientM)*60000;//Разность поясов. Прибавить, чтобы снова вернуться к местному серверному
onload=function(){setInterval("clock1()",999);clock1();}
function clock1(){var D0;hms('timeK',D0=new Date);
      hms('time',new Date(D0.getTime()+DD));
      hms('timeS',new Date(D0.getTime()+DD+DPoyas));
}
function hms(layr,X){var m,s;    d.getElementById(layr).innerHTML
      =X.getHours()+':'+((m=X.getMinutes())<10?'0':'')+m+':'+((s=X.getSeconds())<10?'0':'')+s;
}
</script>
(Собирался дальше копать - учесть задержку передачи от сервера к клиенту, но не доделал.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)