Get TIme from TimeServer

I am trying to get the Time from a NIST timeserver. How can I do this. I can use any language but I prefer php

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

<?php
/* Query a time server
   (C) 1999-09-29, Ralf D. Kloth (QRQ.software) <ralf at qrq.de> */
$timeserver = "ntp1.sf-bay.org";
$timercvd = query_time_server($timeserver,37);
if (!$timercvd[1]) { # if no error from query_time_server
  $timevalue = bin2hex ($timercvd[0]);
  $timevalue = abs (HexDec('7fffffff') - HexDec($timevalue) - HexDec('7fffffff')) ;
  $tmestamp = $timevalue - 2208988800; # convert to UNIX epoch time stamp
  $datum = date("Y-m-d (D) H:i:s",$tmestamp - date("Z",$tmestamp)); /* incl time zone offset */
  $doy = (date("z",$tmestamp)+1);

  echo "Time check from time server ",$timeserver," : [<font color=\"red\">",$timevalue,"</font>]";
  echo " (seconds since 1900-01-01 00:00.00).<br>\n";
  echo "The current date and universal time is ",$datum," UTC. ";
  echo "It is day ",$doy," of this year.<br>\n";
  echo "The unix epoch time stamp is $tmestamp.<br>\n";
} #if (!$timercvd)
else {
  echo "Unfortunately, the time server $timeserver could not be reached at this time. ";
  echo "$timercvd[1] $timercvd[2].<br>\n";
} # else
?>

source

Solution 2

the complete answer with real code (mix and match of code by birth and kloth):

function query_time_server ($ntpserver, $socket) {
/* Query a time server
   (C) 1999-09-29, Ralf D. Kloth (QRQ.software) <ralf at qrq.de> */

    // parameters: server, socket, error code, error text, timeout
    $fp = fsockopen($ntpserver,$socket,$err,$errstr,3);

    if ($fp) {
        fputs($fp,"\n");
        $timevalue = fread($fp,49);
        fclose($fp); 
    } else {
        $timevalue = " ";
    }

    $ret = array();
    $ret[] = $timevalue;
    $ret[] = $err;     # error code
    $ret[] = $errstr;  # error text
    return($ret);
}
 $got_time = false;
$servers = array(

    'ntp.pads.ufrj.br',
    'ntp2.pads.ufrj.br',
    'ntp3.pads.ufrj.br',
    'time.nist.gov',
    'ntp.on.br',
    'ntp2.on.br'
);


try { 
    foreach ( $servers as $ntpserver ) {
        echo "</br>".$ntpserver."</br>";

            $fp = @fsockopen( $ntpserver, 37, $errno, $errstr, 2 );
        if ( !$fp ) {
            // offline or connection refused, try next
            echo $ntpserver." is offline or connection refused, try next.</br>";
            //continue;
        } else {

            $data = '';
            while ( !feof( $fp ) ) {
                $data .= fgets( $fp, 4 );
            }
            fclose( $fp );

            if ( strlen( $data ) == 4 ) {
                $got_time = true;
                $time1900 = hexdec( bin2hex( $data ) );
                $timestamp = $time1900 - 2208988800;   // Time server is based on 1900 while Unix is based on 1970

                //break;
            } else {
                $timestamp = "NO RESULT";
            }
            echo $ntpserver." port 37 is ONLINE connection accepted, with result: ".$timestamp."</br>";

        }



        //$ntpserver = "ntp.pads.ufrj.br";

        $timercvd = query_time_server($ntpserver,13);
        //if ($timercvd[1] > "") { echo "urubu patata";}

        if (!$timercvd[1]) { // if no error from query_time_server
            $timevalue = $timercvd[0];
            echo "Time check from time server ".$ntpserver." on port 13 : <font color='red'>".$timevalue."</font></br>";
            //echo "Time check from time server ".$ntpserver." : [<font color=\"red\">".$timevalue."</font>].<br>\n";
        }  else {
            echo "Unfortunately, the time server $ntpserver could not be reached at this time on port 13. </br>";
            echo "$timercvd[1] $timercvd[2].<br>\n";
        } //*/
    }
} catch (Exception $e) {
    echo "Exceção pega2: ",  $e->getMessage(), "\n";
} ?>

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply