Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Operazioni con le date.

    Ciao a tutti!
    Sono nuovo del forum!

    nel mio programma sto sviluppando un funzione in js che mi restituisce l'ora esatta del server che si incrementa dinamicamente... il mio problema è che non vuol sapere di funzionare!

    vi posto il codice... magari occhi più esperti mi sapranno dire dove sto sbagliando!


    function oraServer (anno,mese,giorno,ore,minuti,secondi) {
    var xdataServer=new Date(anno,mese,giorno,ore,minuti,secondi)
    var xdataClient=new Date()
    var Diff = new Date(xdataClient - xdataServer)
    var dataEsatta = new Date(xdataClient + Diff)
    var timeValue = showZeroFilled(dataEsatta.getFullYear() + "/" + dataEsatta.getMonth() + "/" + dataEsatta.getDate() + " " + dataEsatta.getHours()) + ":" + showZeroFilled(dataEsatta.getMinutes()) + ":" + showZeroFilled(dataEsatta.getSeconds());
    document.orologio.orario1.value = timeValue;
    setTimeout("oraServer(" + anno + "," + mese + "," + giorno + "," + ore + "," + minuti + "," + secondi + ")",1000);
    }

    Grazie in anticipo!
    Alessio.

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: sinceramente non me la sento di guardare il codice, però, visto che, con il suggerimento dei moderatori di questo forum, l'ho implementato qualche tempo fa, se vuoi ti passo il codice.
    Comunque, l'idea è di lavorare sulla differenza di tempo tra il server e il locale:

    1) il server si procura l'ora esatta e la scrive in una variabile client

    2) il client calcola i millesecondi di differenza tra l'ora attuale e quella passata dal server

    3) ad intervalli regolare, per esempio 500 millisecondi, il client costruisce il tempo, aggiungendo al locale il delta calcolato prima, sempre uguale.

    4) Per esperienza ho notato l'orologio così ottenuto va indietro di alcuni secondi, dovuti forse al tempo che impiega il browser per leggere tutta la pagina.

    5) questo ritardo viene annullato con circa 2 o 3 sincronizazioni (da farsi con ajax)

    6) l'orogio così ottenuto è quasi in perfetta sincronia con un applet java messo nella pagina per controllo
    Pietro

  3. #3
    Grazie per la risposta!

    anch'io volevo ricavare l'ora esatta lavorando con le differenza tra client e server...
    il mio problema e che non conoscendo molto il js e non potendo debuggare il codice che scrivo mi risulta molto difficile capire dove sbaglio!

    se mi posti il tuo codice da confrontare con il miom, per me sarebbe perfetto!

    Ciao!

    Alessio.

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti mando l'html prodotto dalla pagina server.

    L'istruzione:

    var j = {anno:2007,mese:3,giorno:05,ora:09,minuto:54,secon do:24,millisecondo:0 };

    nella pagina reale è:
    var j = <%=json%>;

    dove json è una variabile server stringa che restituisce appunto la data del server sotto forma di oggetto javascript

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>
    	Pagina senza titolo
    </title><link href="../../stili/Styles.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript" src="../../js/ajax.js"></script>
    <script language="javascript" type="text/javascript">
    // <!CDATA[
    
    var blocco_setTimeout = null;//utilizzato per mostrare l'ora ogni 111 ms
    var Timeout = 5000;
    var delta = 0;
    function window_onload() 
    {
        var j = {anno:2007,mese:3,giorno:05,ora:09,minuto:54,secondo:24,millisecondo:0  };
        //se non ci sono problemi con l'ora esatta, calcolo la differenza delta tra
        //l'ora locale e quella esatta (millisecondi). Altrimenti uso il predefinito,
        //delta = 0, che equivale ad usare l'ora del computer
        if(j.anno != "-1")
        {
            var millisecondi = new Date(j.anno, j.mese, j.giorno, j.ora, j.minuto, j.secondo, j.millisecondo).getTime();
            delta = millisecondi - new Date().getTime();
        }
        
        //mostra l'ora corretta ogni 111 ms
        getOraLocaleCorretto();
        
        //recupera l'ora esatta ogni Timeout
        window.setTimeout("recupera_ora()", Timeout);
        Timeout = Timeout * 2; if(Timeout > 60000) Timeout = 60000;
    
    }
    
    //ricavo l'ora esatta dall'ora computer aggiungendo il delta
    //e lo mostro
    function getOraLocaleCorretto()
    {
        var millisecondi = new Date().getTime() + delta;
        var data = new Date(millisecondi);
        
        var mesi = ["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"];
        
    	var anno = data.getFullYear();
    	var mese = data.getMonth();
    	var giorno = data.getDate();
    	var ora = data.getHours() + ""; if(ora.length < 2) ora = "0" + ora;
    	var minuto = data.getMinutes() + ""; if(minuto.length < 2) minuto = "0" + minuto;
    	var secondo = data.getSeconds() + ""; if(secondo.length < 2) secondo = "0" + secondo;
    	
    	var orologio = giorno + " " + mesi[mese] + " " + anno + ", " + ora + ":" + minuto + ":" + secondo;
        
        $("Label_ore_client").innerHTML = orologio;
        //mostra l'ora corretta ogni 111 ms
        blocco_setTimeout = window.setTimeout(function(){getOraLocaleCorretto();}, 111);
    }
    
    
    //ogni tot secondi recupero l'ora esatta dal server
    //se non ci sono errori aggiorno il delta
    function recupera_ora()
    {
        $("span1").style.visibility = "visible";
        ajax("?ajax_comando=1", onload, null, onerror);
        function onload()
        {
    		$("span1").style.visibility = "hidden";
    		var t = this.request.responseText; 
    
    		window.clearTimeout(blocco_setTimeout);
    
            var j = null;
            try
            {
    	        j = eval("(" + t + ")");
            }
            catch (err)
            {
                j = {anno:'-1'};
            }
    
            if(j.anno != "-1")
            {
                var millisecondi = new Date(j.anno, j.mese, j.giorno, j.ora, j.minuto, j.secondo, j.millisecondo).getTime();
                delta = millisecondi - new Date().getTime();
            }
            
            
            getOraLocaleCorretto();
    		
    		window.setTimeout("recupera_ora()", Timeout);
    		Timeout = Timeout * 2; if(Timeout > 60000) Timeout = 60000;
        
        }
        
        function onerror()
        {
            window.clearTimeout(blocco_setTimeout);
            
            $("span1").style.visibility = "hidden";
            getOraLocaleCorretto();
    		
    		window.setTimeout("recupera_ora()", Timeout);
    		Timeout = Timeout * 2; if(Timeout > 60000) Timeout = 60000;
            
        }
    
    }
    
    // ]]>
    </script>
    </head>
    <body onload="return window_onload()">
        <form name="form1" method="post" action="ora esatta.aspx" id="form1">
            <h3>
                Tempo Campione Italiano</h3>
            
    
    
                Orologio sincronizzato con i segnali di tempo campione generati all' Istituto Elettrotecnico Nazionale "Galileo Ferraris" in Torino.</p>
            
    
    
                Data:
                <span id="Label_data">giovedì 5 aprile 2007</span></p>
            
    
    
                <span style="display:none;">Ore:
                <span id="Label_ore" style="font-size:XX-Large;">9.54.24</span>server
                
    </span>
                Ore:
                <span id="Label_ore_client" style="font-size:XX-Large;"></span>
                
    
                <span id="span1" style="color:Red; font-weight:bold; visibility:hidden;">refresh</span>
            </p>
            
            
    
    
                Refresh</p>
        </form>
        <applet codebase="http://www.bipm.org/SntpV2/applet/" code="bipm_daytime.bipm_daytime.class" name="BIPM_DAYTIME" align="middle" height="147" hspace="0" vspace="0" width="350">
            <param name="SERVERURL" value="http://www.bipm.org/SntpV2/servlet/SNTPServlet"/>
            <param name="POLLING" value="10"/>
        </applet>
    </body>
    </html>
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.