10

我正在编写一个计数脚本来计算旧日期和今天之间的时间。
一切都很好,直到我在错误日期的计算机上测试并看到结果。
所以我找到了一种通过http://json-time.appspot.com/time.json获取 NTP 时间的方法。
问题是我每毫秒都需要当前时间,因为我想计算毫秒数,但不可能每毫秒向 NTP 服务器发送请求。
这是一些示例代码,可以查看我在写什么

            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);
4

3 回答 3

11

首先,JS 调度程序有一定的粒度——也就是说,你可以请求一个小于 20 毫秒的间隔,但它不会立即触发——你可以看到每 20 毫秒触发 20 个事件。

其次,即使可以,这也不是一个好主意:您将每秒从使用此脚本的每台计算机发出 1000 个请求。即使客户端和他们的连接可以处理这个问题,对于 JSON 服务器来说也无异于 DDoS。

你可以做的是:

  • 从 JSON-NTP 获取时间(一次),这将是一个日期
  • 获取本地时间(一次),这将是一个日期
  • 计算 NTP 和本地时间之间的差异(一次),这可能是本地时间关闭的毫秒数
  • 每次计算时,都要考虑差异
于 2011-04-02T08:59:47.487 回答
4

把它放在文档的顶部:

var clientTime = new Date();

这在您的文档底部:

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)

然后,如果您需要知道某事的持续时间:

var startTime = new Date();

// [processing...]

var endTime = new Date();
var duration = endTime - startTime; // in milliseconds
var startTimeServer = startTime + deltaTime;
var endTimeServer = endTime + deltaTime;
于 2011-04-02T09:17:57.610 回答
2

我不确定您是否了解 NTP 的用途:即同步计算机中的内部时钟,而不是用作时钟本身。

我建议您连接到 NTP 服务一次以获取与客户端内部时间的差异,并使用它来更正它以进行显示。但我不完全确定,为什么与客户端计算机时间进行比较是不够的。

于 2011-04-02T08:56:24.720 回答