Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Время
 
 автор: Atom   (02.11.2005 в 00:14)   письмо автору
 
 

Есть текущее время, определяемое php скриптом. И нужно чтобы javascript использовал его как исходное для часов.
Иными словами как сделать часы на Javascript, только с учетом, что время должно быть не текущее у пользователя, а заданное скриптом пхп?

   
 
 автор: codexomega   (02.11.2005 в 07:44)   письмо автору
 
   для: Atom   (02.11.2005 в 00:14)
 

И это возможно.
Код взят с сайта на английском, переводить было лень, но в принципе там пошаговые комметарии и дураку понятны.



<!-- THREE STEPS TO INSTALL SERVERDATE TO JAVASCRIPT:

  1.  Save the code in a file called "servertime.php"
  2.  Copy the coding into the HEAD of your HTML document
  3.  Add the last code into the BODY of your HTML document  -->

<!-- STEP ONE:  Paste this code in a file called "servertime.php"
 (without the quotes) and place it in the main directory of your site.
 Change mode to executable - chmod 755  -->


<?php

/* Copyright 2005 Emery Wooten - www.mresoftware.com
 This script is called from Javascript. It should be called before any
 JavaScripts that use the date.
 Place the statement below in the <head> section of your HTML page:
 <script type="text/javascript" src="http://shamar.org/servertime.php"></script>
*/

// Supress errors
error_reporting(0);

/* If your server is not in your time zone, adjust it here.  Mine is 1 hour East of me.
To use this variable, you will need to remove the "//".
// $myServerOffset = (+1) * 3600;

// Get server date
$mydate = date("U");

// Get Timezone offset
$myoffs = date("Z") - $myServerOffset;

// Adjust offsets for local machine
print "var tzoffset = $myoffs + (new Date().getTimezoneOffset()*60);";

// Set JavaScript variable to your server time as seen from client machine's location.
print "var servertimeOBJ=new Date(($mydate+tzoffset)*1000);";
?>


<!-- STEP TWO: Paste this code into the HEAD of your HTML document  -->

<HEAD>

<script language="JavaScript" src="http://shamar.org/servertime.php"></script>

<script type="text/javascript">
<!-- Begin
/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Emery Wooten :: www.mresoftware.com */

// First thing, reference the variable.
var servertimeOBJ;

// Now check that it is set
if (servertimeOBJ != null){
    var 
myscriptTime servertimeOBJ;
}

// If server time not passed, use client's time
else{
    var 
myscriptTime = new Date();
}

/* "myscriptTime" is a variable local to this script. Name it as you wish.
 After the above code is executed, this local variable is used for all date/time
 calculations performed by the script. If all works, this variable
 contains the server date as a proper JavaScript date object. */

// End -->
</script>

</HEAD>


<!-- STEP THREE: Copy this code into the BODY of your HTML document  -->


<BODY>

<script type="text/javascript">
<!-- Begin
  document.write(myscriptTime)
// End -->
</script>

<p><center>
<font face="arial, helvetica" size"-2">Free JavaScripts provided<br>
by <a href="http://javascriptsource.com">The JavaScript Source</a></font>
</center><p>

<!-- Script Size:  2.48 KB -->

   
 
 автор: Atom   (02.11.2005 в 20:03)   письмо автору
 
   для: codexomega   (02.11.2005 в 07:44)
 

Я наверное не правильно описАл проблему =) Мне нужно чтобы часы шли еще =)

   
 
 автор: codexomega   (02.11.2005 в 20:50)   письмо автору
 
   для: Atom   (02.11.2005 в 20:03)
 

Этот ЯваСкрипт показывает часы с секундами.
Можно взять за основу и кое что подделать.
Для запуска данного скрипта используется:
<body onLoad="show_clock()">


    var myfont_face = "Arial";
    var myfont_size = "11px";
    var myfont_color = "#333333";
    var myback_color = "transparent";
    var mywidth = 80;
    var my12_hour = 1;

    var dn = ""; var old = "";

    if (document.all||document.getElementById) { document.write('<span id="LiveClockIE" style="width:'+mywidth+'px; background-color:'+myback_color+'"></span>'); }
    else if (document.layers) { document.write('<ilayer bgColor="'+myback_color+'" id="ClockPosNS"><layer width="'+mywidth+'" id="LiveClockNS"></layer></ilayer>'); }
    else { old = "true"; show_clock(); }

    function show_clock() {

        //show clock in NS 4
        if (document.layers)
                document.ClockPosNS.visibility="show"
        if (old == "die") { return; }

        var Digital = new Date();
        var hours = Digital.getHours();
        var minutes = Digital.getMinutes();
        var seconds = Digital.getSeconds();

        if (my12_hour) {
            dn = "AM";
            if (hours > 12) { dn = "PM"; hours = hours - 12; }
            if (hours == 0) { hours = 12; }
        } else {
            dn = "";
        }
        if (minutes <= 9) { minutes = "0"+minutes; }
        if (seconds <= 9) { seconds = "0"+seconds; }

        myclock = '';
        myclock += '<font style="color:'+myfont_color+'; font-family:'+myfont_face+'; font-size:'+myfont_size+'pt;">';
        myclock += hours+':'+minutes+':'+seconds+' '+dn;
        myclock += '</font>';

        if (old == "true") {
            document.write(myclock);
            old = "die"; return;
        }

        if (document.layers) {
            clockpos = document.ClockPosNS;
            liveclock = clockpos.document.LiveClockNS;
            liveclock.document.write(myclock);
            liveclock.document.close();
        } else if (document.all) {
            LiveClockIE.innerHTML = myclock;
        } else if (document.getElementById) {
            document.getElementById("LiveClockIE").innerHTML = myclock;
        }

        setTimeout("show_clock()",1000);
}

   
 
 автор: Atom   (02.11.2005 в 23:45)   письмо автору
 
   для: codexomega   (02.11.2005 в 20:50)
 

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

<script language="javascript">
    var dn = ""; var old = "";
    if (document.all||document.getElementById)
    {
       document.write('<span id="LiveClockIE"></span>');
    }
    else if (document.layers)
    {
       document.write('<ilayer id="ClockPosNS"><layer id="LiveClockNS"></layer></ilayer>');
    }
    else
    {
       old = "true"; show_clock();
    }
    function show_clock()
    {
       if (document.layers)
          document.ClockPosNS.visibility="show"
       if (old == "die") { return; }

       var Digital = new Date();
//модификация тут. таким образом передаю время из скрипта
       var hours = <?=gmdate("G") + 2?>; //Digital.getHours();
       var minutes = Digital.getMinutes();
       var seconds = Digital.getSeconds();

       myclock = '';
       myclock += hours+':'+minutes+':'+seconds;

       if (old == "true")
       {
          document.write(myclock);
          old = "die"; return;
       }
       if (document.layers)
       {
          clockpos = document.ClockPosNS;
          liveclock = clockpos.document.LiveClockNS;
          liveclock.document.write(myclock);
          liveclock.document.close();
       }
       else if (document.all)
       {
          LiveClockIE.innerHTML = myclock;
       }
       else if (document.getElementById)
       {
          document.getElementById("LiveClockIE").innerHTML = myclock;
       }

       setTimeout("show_clock()",1000);
}
</script>

Но проблема в том, что если меняется час, то в этих часах время не изменяется. Совсем торможу :((

   
 
 автор: codexomega   (02.11.2005 в 23:54)   письмо автору
 
   для: Atom   (02.11.2005 в 23:45)
 

Ураа! Нашел.
Вот, с живым примером и скриптом:
http://www.javascriptkit.com/script/script2/servertime.shtml

   
 
 автор: 12345   (03.11.2005 в 00:41)   письмо автору
 
   для: Atom   (02.11.2005 в 23:45)
 

Атоm: немного не там вставил. Надо вместо var Digital = new Date(); писать
var Digital = <?=time()*1000?>
. Проблема только в том, что нет контроля за скоростью передачи страницы, поэтому часы на странице будут отставать на (время загрузки) секунд от серверного времени.

И вообще, скрипт устаревший и имеет не нужные для России AM/PM.

codexomega: По-моему, лучше учиться писать свои скрипты, чтобы не привносить мусора в код сраницы, в котором рано или поздно придётся разбираться.

Поправил скрипт, и получилось:
<div id=time></div>
<script>
onload=function(){setInterval("clock1()",999);}
function clock1(){var D,m,s;document.getElementById('time').innerHTML=
    (D=new Date()).getHours()+':'
    +((m=D.getMinutes())<10?'0':'')+m+':'
    +((s=D.getSeconds())<10?'0':'')+s;
}
</script>
Менять на рнр надо, как и там, new Date(). Ведь намного короче.

   
 
 автор: Atom   (03.11.2005 в 14:29)   письмо автору
 
   для: 12345   (03.11.2005 в 00:41)
 

Секунды мне не важны, там часы без секунд.
Но не работает! Если в вашем скрипте стоит new Date то все ок, а если time()*1000 то не пашет
И немного непонятно, как мне с этим time() добиться времени GMT +2, при том что я совершенно не знаю какое там время будет на сервере :(

   
 
 автор: 12345   (03.11.2005 в 20:28)   письмо автору
 
   для: Atom   (03.11.2005 в 14:29)
 

А, да, забыл, что время из числа надо в объект даты перевести!

time() в рнр показывает системное время, и, действительно, нужно позаботиться о взятии гринвичского. Берём справочники JS (http://xlibscripts.land.ru/jscript_doc/JavaScript/DateJS.html) и рнр, и действуем.
<div id=time></div> 
<script> DD=0;
onload=function(){Dphp=1131037423000; //=<?=gmmktime()*1000?>Гринв.вр.сервера в миллисекундах
    //Для проверки поставлено время 20:03 MSK. Стартовать всегда будет с этого.
    Djs=new Date(); //Местное время клиента в миллисекундах
    DD=Dphp-Djs;//Эту разность будем прибавлять, чтобы получить серверное, но в местном поясе.
    setInterval("clock1()",999);clock1();} 
function clock1(){var D,m,s;
    document.getElementById('time').innerHTML= 
    (D=new Date((new Date()).getTime()+DD)).getHours()+':' 
    +((m=D.getMinutes())<10?'0':'')+m+':'     +((s=D.getSeconds())<10?'0':'')+s;

</script> 
Здесь, возможно, не то, что нужно Вам. Не местное серверное время, а как-то сдвинутое. В общем, инструмент Вам дал, а дальше - просьба разобраться в поправках, чтобы само везде работало и поделиться результатами.

   
 
 автор: Atom   (03.11.2005 в 23:26)   письмо автору
 
   для: 12345   (03.11.2005 в 20:28)
 

Я долго парился с временем по Гринвичу и пр, но так и не понял как задать время для Date(). Пробовал setTime(<?=gmmktime((gmdate("G")+2)*1000)?>) но не работает почему-то. Пробовал new Date(<?=gmmktime((gmdate("G")+2)*1000)?>), но получается статичное время(т.е. часы не идут). В итоге забил на эту затею, не могу на нее тратить столько времени. Если есть идеи, как реализовать - буду рад узнать =)

   
 
 автор: 12345   (04.11.2005 в 01:30)   письмо автору
 
   для: Atom   (03.11.2005 в 23:26)
 

Так не надо время форматировать в рнр! gmmktime()*1000 даёт всё необходимое, и брать нужно в миллисекундах, чтобы потом вычислить разность, как написано. Потом форматировать в JS, потому что именно JS выводит идущее время.

   
 
 автор: 12345   (04.11.2005 в 01:30)   письмо автору
 
   для: Atom   (03.11.2005 в 23:26)
 

Так не надо время форматировать в рнр! gmmktime()*1000 даёт всё необходимое, и брать нужно в миллисекундах, чтобы потом вычислить разность, как написано. Потом форматировать в JS, потому что именно JS выводит идущее время.

А я не очень представляю, что тебе нужно - то ли местное серверное, то ли переведённое в часовой пояс клиента. Но, так или иначе, отлаживать и дописывать лучше в деле, с рнр на основе моего скрипта, где все детали сделаны, осталось собрать.

Разнузданный пример с комментариями для слежения за серверным временем (исполнять в файле PHP):
<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?>;//Гринв.вр.сервера в миллисекундах
      //Если пишется без пхп, заменить выражение числом 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;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
    dServM=<?=date('Z')/60?>;
      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,D,m,s;D0=new Date;
    d.getElementById('timeK').innerHTML
      =D0.getHours()+':' 
      +((m=D0.getMinutes())<10?'0':'')+m+':'     +((s=D0.getSeconds())<10?'0':'')+s;
    d.getElementById('time').innerHTML
      =(D=new Date(D0.getTime()+DD)).getHours()+':'
      +((m=D.getMinutes())<10?'0':'')+m+':'     +((s=D.getSeconds())<10?'0':'')+s;
    d.getElementById('timeS').innerHTML
      =(D=new Date(D0.getTime()+DD+DPoyas)).getHours()+':'
      +((m=D.getMinutes())<10?'0':'')+m+':'     +((s=D.getSeconds())<10?'0':'')+s;
}
</script>
Посмотри, пожалуйста, как работает, в правильную сторону ли прибавляет, а то проверял только на локальном.

   
 
 автор: Atom   (04.11.2005 в 11:15)   письмо автору
 
   для: 12345   (04.11.2005 в 01:30)
 

Результат -

Местное время клиента: 11:10:16
Время сервера с переводом на зону клиента: 11:10:15
Местное время сервера: 11:10:15
Начальное время сервера: Fri Nov 4 14:08:52 UTC+0300 2005
Начальное время клиента: Fri Nov 4 14:08:52 UTC+0300 2005
Часовой пояс сервера: 180
Часовой пояс клиента: 180


Первые два времени соответствуют текущему, а начальное с сервера и клиента неправильное... (

   
 
 автор: 12345   (04.11.2005 в 16:13)   письмо автору
 
   для: Atom   (04.11.2005 в 11:15)
 

Почему неправильное, если 14:08 минус 3 часа есть 11:08 ? Это времена по Гринвичу (UTC) с указанием часового пояса. Тут, я вижу, правильно, и сервер с клиентом в одном часовом поясе. Интересно проверить случай, когда сервер и клиент будут в разных часовых поясах.

Сделал код покомпактнее:
<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?>;//Гринв.вр.сервера в миллисекундах
      //Если пишется без пхп, заменить выражение числом 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;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе
    dServM=<?=date('Z')/60?>;
      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>

   
 
 автор: 12345   (08.11.2005 в 01:58)   письмо автору
 
   для: 12345   (04.11.2005 в 16:13)
 

Ещё лучше, без лишних переменных:
<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?>;//Гринв.вр.сервера в миллисекундах 
      //Если пишется без пхп, заменить выражение числом 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;//Разнобой часов. Прибавлять, чтобы получить серверное, но в местном поясе 
    dServM=<?=date('Z')/60?>
      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){d.getElementById(layr).innerHTML=X.getHours()
     +':'+(X.getMinutes()/100).toFixed(2).substr(2)+':'+(X.getSeconds()/100).toFixed(2).substr(2);

</script> 
Здесь последняя строчка +((m=X.getMinutes())<10?'0':'')+m+ заменена на +(X.getMinutes()/100).toFixed(2).substr(2)+ .

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования