Вопрос по синхронизации времени

Discussion in 'PHP' started by GreenpeopleE, 27 Dec 2011.

  1. GreenpeopleE

    GreenpeopleE New Member

    Joined:
    25 Sep 2010
    Messages:
    17
    Likes Received:
    2
    Reputations:
    0
    В общем есть скрипт

    PHP:
    //Скрипт обратного отсчета времени CountDown

    var eventstr "C новым годом!!!"//Эта строка выводиться по окончанию отсчета
    var countdownid document.getElementById("countdown"); //ID элемента в который выводится время

    var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

    function 
    CountDowndmn(yr,m,d){
        
    cdyear=yr;
        
    cdmonth=m;
        
    cdday=d;
        var 
    today=new Date();
        var 
    todayy=today.getYear();
        if (
    todayy 1000)
        
    todayy+=1900;
        var 
    todaym=today.getMonth();
        var 
    todayd=today.getDate();
        var 
    todayh=today.getHours();
        var 
    todaymin=today.getMinutes();
        var 
    todaysec=today.getSeconds();
        var 
    todaystring=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec;
        
    futurestring=montharray[m-1]+" "+d+", "+yr
        dd
    =Date.parse(futurestring)-Date.parse(todaystring);
        
    dday=Math.floor(dd/(60*60*1000*24)*1);
        
    dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1);
        
    dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1);
        
    dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1);
        if(
    dday<=0&&dhour<=0&&dmin<=0&&dsec<=1){
        
    countdownid.innerHTML=eventstr;
    return
    }
    else {
        var 
    lastchar ""+dsec;    lastchar lastchar.substring(lastchar.length-1,lastchar.length);
        var 
    dsecstr "секунд";
        if (
    lastchar=="1") { dsecstr "секунда"; }
        if ((
    lastchar=="2")||(lastchar=="3")||(lastchar=="4")) { dsecstr "секунды"; }
        
        
    lastchar ""+dmin;    lastchar lastchar.substring(lastchar.length-1,lastchar.length);
        var 
    dminstr    "минут";
        if (
    lastchar=="1") { dminstr "минута"; }
        if ((
    lastchar=="2")||(lastchar=="3")||(lastchar=="4")) { dminstr "минуты"; }

        
    lastchar ""+dhour;    lastchar lastchar.substring(lastchar.length-1,lastchar.length);
        var 
    dhourstr   "часов";
        if (
    lastchar=="1") { dhourstr "час"; }
        if ((
    lastchar=="2")||(lastchar=="3")||(lastchar=="4")) { dhourstr "часа"; }

        
    lastchar ""+dday;    lastchar lastchar.substring(lastchar.length-1,lastchar.length);
        var 
    ddaystr "дней";
        if (
    lastchar=="1") { ddaystr "день"; }
        if ((
    lastchar=="2")||(lastchar=="3")||(lastchar=="4")) { ddaystr "дня"; }

        
    countdownid.innerHTML="ДО НОВОГО ГОДА осталось: <br> "+dday" " +ddaystr+",  "+dhour+" "+dhourstr+", "+dmin+" "+dminstr+" и "+dsec+" "+dsecstr;
    }
    setTimeout("CountDowndmn(cdyear,cdmonth,cdday)",1000);
    }

    CountDowndmn(2012,1,1); //Дата отсчета

    как сделать так, что бы время синхронизировалось не с ПК пользователя, а например с временем отдельного сайта?...

    поможет кто?)

    //Gifts: Поправил подсветку
     
    #1 GreenpeopleE, 27 Dec 2011
    Last edited by a moderator: 2 Jan 2012
  2. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    GreenpeopleE, джава скрипты выполняются на стороне пользователя, соответственно
    var today=new Date();
    выдаст время пользователя...

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

    первое, что приходит на ум:

    1) написать скрипт получения времени с сервера.
    2) написать фкнкцию в джава скрипте, которая будет обращаться к скрипту и получать соответственно время сервера в чистом виде (наверно можно обойтись и без пхп скрипта, но мне кажется геморней)
    3) в переменную today засунуть результат работы скрипта из пункта 2)
     
    1 person likes this.
  3. GreenpeopleE

    GreenpeopleE New Member

    Joined:
    25 Sep 2010
    Messages:
    17
    Likes Received:
    2
    Reputations:
    0
    спасибо))сейчас что - нибудь придумаю))
     
    1 person likes this.
  4. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Вот если что для примера

    пхп скрипт time.php:
    PHP:
    <?php


    function request($url ''$post ''$ref '')
         {

        
    $u parse_url($url);
        
    $path $u[path].'?'.$u[query];

        global 
    $COOKIE;

        if (
    $COOKIE)
             {
            foreach (
    $COOKIE as $n => $v)
            
    $COOK .= $n.'='.$v.';';
             }

        
    $ip gethostbyname($u[host]);
        
    $fp fsockopen($ip,80,$en,$es,15);

        if(!
    $fp){exit('Connection failed. Error #'.$en.': '.$es);}  
        
        if (!empty(
    $post)) {$req "POST $path HTTP/1.1\r\n";} else {$req "GET $path HTTP/1.0\r\n";}
        
    $req .= "Host: $u[host]\r\n";
        
    $req .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4\r\n";
        if (!empty(
    $ref)) {$req .= "Referer: $ref\r\n";}
        
    $req .= "Content-type: application/x-www-form-urlencoded\r\n";
        if (!empty(
    $post)) {$req .= "Content-length: "strlen($post) ."\r\n";}
        
    $req .= "Cookie:".substr($COOK0strlen($COOK)-1)."\r\n";
        
    $req .= "Connection: close\r\n\r\n";
        if (!empty(
    $post)) {$req .= $post;}
        
    fwrite($fp,$req);
     

        while(!
    feof($fp))
             {
              
    $s .= fgets($fp,256);
             }


        
    fclose($fp);
        
    preg_match_all("/(?<=Set-Cookie: )(.*?)(?=\;)/"$s $cook);

        foreach (
    $cook[0] as $str)
            {
              list (
    $name$val) = explode('='$str);
              
    $COOKIE[$name]=$val;
        
            }


        return 
    $s;

    }


    $ex request('http://mail.ru');



    preg_match("/Date: (.+?)\r\n/"$ex$t);
    $t trim($t[0]);
    echo 
    $t;


    ?>

    Скрипт выведет время сервера mail.ru

    Далее функция джава скрипта:

    Code:
    function _get(url)
         {
    	if(!url) return 0;
    	var xmlhttp;
    	try
    	     {
    		if (window.XMLHttpRequest)
    		     {
    			xmlhttp=new XMLHttpRequest();
    		     }
    		else if (window.ActiveXObject)
    		     {
    			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    		     }
    		xmlhttp.open("GET",url,false);
    		xmlhttp.send(null);
    		if (xmlhttp.readyState==4)
    		     {
    			return xmlhttp.responseText;
    		     }
    	     }
    	catch(er){}
    
    	return null;
         }

    В своём джава скрипте делаешь
    var today=_get('time.php');
    вместо
    var today=new Date();


    По сути должно работать, а пхп скрипт надо причесать, просто запостил то, что было под рукой, он для других нужд...
     
  5. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    135
    Reputations:
    4
    есть один простой но довольно тру способ узнать время.
    PHP:
    mysql_query("now();");
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    ТСу уже, скорее всего, не актуально, но Fepsis, barnaki вы прикалываетесь что ль?
     
    _________________________
  7. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Хех... жжоте ребята)
    если тебе надо с временем своего хостинга соединить то:
    1) Суём данный код не в JS а в PHP файл
    2) Меняем на это:
    PHP:
    var today=new Date();
    today.setTime(<?= time();?>*1000);
    вуаля...) пхп на прямую впишет в JS время сервера с которого и послужит дефолтным в жс...)

    // Gifts: here, I fixed it
     
    #7 Mixon, 2 Jan 2012
    Last edited by a moderator: 2 Jan 2012
    2 people like this.