Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript NTP time

I'm writing a counting script who counts the time between an old date and today.
Everything worked good until I tested on a computer with wrong date and saw the results.
So I found a way to get NTP time via http://json-time.appspot.com/time.json.
The problem is that I need the current time every millisecond because I want to count the milliseconds but Its impossible the send request to the NTP server every milisecond.
This is some example code to see what I'm writing about

            var today;
        $(document).ready(function(){

            $.data = function(success){
                $.get("http://json-time.appspot.com/time.json?callback=?", function(response){
                    success(new Date(response.datetime));
                }, "json");
            };
        });

        function update(){
            var start = new Date("March 25, 2011 17:00:00");
            //var today = new Date();
            $.data(function(time){
                today = time;
            });
            var bla = today.getTime() - start.getTime();
            $("#milliseconds").text(bla);
        }

        setInterval("update()", 1);
like image 630
David Avatar asked Apr 02 '11 08:04

David


2 Answers

put this right at the top of your document:

var clientTime = new Date();

and this right at the bottom of your document:

var serverTime = new Date("<have the server put here its current date/time along its timezone>");
var deltaTime = serverTime - clientTime; // in milliseconds (expected accuracy: < 1 second)

then, if you need to know the duration of something:

var startTime = new Date();

// [processing...]

var endTime = new Date();
var duration = endTime - startTime; // in milliseconds
var startTimeServer = startTime + deltaTime;
var endTimeServer = endTime + deltaTime;
like image 87
CAFxX Avatar answered Oct 13 '22 00:10

CAFxX


First of all, the JS scheduler has a certain granularity - that is, you can request an interval smaller than, say, 20 msec, but it will not fire immediately - what you could see is 20 events fired off every 20 msec.

Second, even if you could, this is not a good idea: you would be making 1000 requests every second, from every computer which uses this script. Even if the client and their connections could handle this, it's nothing short of a DDoS for the JSON server.

What you could do is this:

  • get time from JSON-NTP (once), this will be a Date
  • get local time (once), this will be a Date
  • calculate the difference between NTP and local time (once), this will likely be the number of msec that local time is off
  • for every time calculation, take the difference into account
like image 29
Piskvor left the building Avatar answered Oct 12 '22 23:10

Piskvor left the building