NTP for Javascript

by @jehiah on 2005-10-24 04:12
Filed under: All, Javascript, ajax

So you want to display the current time in the browser, but you know computers are surprisingly horrible at keeping time. Worse yet you can't dictate NTP as a requirement to people browsing your site. NTP for Javascript to the rescue.

Go ahead. try it out. Change your PC's time and click the rerun link in the next line.

The corrected current time is

NTP for Javascript uses prototype.js but only for the sync() operation.

<script language="javascript" src="/js/prototype.js"></script>
<script language="javascript" src="/js/NTP.js"></script>
<script language="javascript">

NTP.sync() will make a configurable number of requests to the server. It passes the client timestamp in milliseconds UTC time.

GET /sandbox/gettime?t=1130036017399

Creates the following response with the offset and a copy of the timestamp which the offset is based. The following response shows an 11.1 second offset.


An average of the offset responses from the server get stored in the cookie NTPClockOffset after taking into account network delay.

To make use of this offset value pass a timestamp to NTP.fixTime()

var time = new Date();
time = Date(NTP.fixTime(time.getTime()));

Without a parameter, NTP.fixTime() will return an adjusted UTC timestamp.

Now We can Create a simple Clock to display the Correct time (or add one line to modify Ray Stotts code) to give us the corrected clock you see at the top of this page.

// Zulu-time clock
function jsClockGMT(){
     // Copyright 1999 - 2001 by Ray Stott
    if (!document.getElementById('clock0')) {
    gmtMS = NTP.fixTime(); // offset for how bad our clock is off zulu to zulu
    var gmtTime =  new Date(gmtMS); // build a new object so we get the right txt back

    var monthNames = ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
    var hour = gmtTime.getUTCHours();
    var minute = gmtTime.getUTCMinutes();
    var second = gmtTime.getUTCSeconds();
    var year = gmtTime.getUTCFullYear();
    var month = monthNames[gmtTime.getUTCMonth()];
    var day = gmtTime.getUTCDate();
    var temp = day + " " + month + " " + year;
    temp += " " + ((hour < 10) ? "0" : "") + hour;
    temp += ((minute < 10) ? ":0" : ":") + minute;
    temp += ((second < 10) ? ":0" : ":") + second;
    temp += " Z ";
    document.getElementById('clock0').innerHTML = temp;


Of course this assumes you are running ntpd on your server against pool.ntp.org or have some other way to keep your server synced.

Subscribe via RSS ı Email
© 2016 - Jehiah Czebotar