客户端和服务器时间的差异

时间:2016-02-03 13:41:57

标签: javascript php angularjs time

我想在php / javascript应用程序中使用服务器时间。到第二个时间对于应用来说非常重要。但是,尽管检查了客户端和服务器时间之间的时间差异,但似乎存在长达3-4秒的差异。

我的角度代码如下;

 // Pre ajax time (so we can see how long it took to get data from server)
    var timeElapsed = new Date().getTime();

    $http.get('/getServerTime.php')
        .success(function (data) {
            // Calculate the length of the ajax request in seconds
            timeElapsed = new Date().getTime() - timeElapsed;

            // Add that to the returned server time to get the current
            // server time. (data.date is provided by the getServerTime.php                       page)
            $scope.serverTime = data.date + timeElapsed;
            $scope.timeDifference = new Date().getTime() - $scope.serverTime;
        });

从理论上讲,这应该可行,但差异最多可达4秒。

我们将非常感谢您提出任何建议或代码修改。

2 个答案:

答案 0 :(得分:2)

将客户端和服务器时间混合在一起并不是一个好主意。 客户端时间根本不可靠,因为用户可以随时随地改变他的时间,无论如何他都想要。如果他觉得好笑,他现在可以在06.06.2066度过他的时间。那你的课程会做什么?可能没什么好处的。 不要混淆这些,最好的方法可能是使用服务器时间 - 只 - 除了你只需要两个时间点的差异来评估持续时间。在这种情况下,您可以使用客户端时间,因为对于时间戳的差异,绝对值无关紧要(2016年或2066年,谁在乎...... 3秒为3秒)

此外,您的代码还有另一个问题。如果你想通过添加从服务器返回的值加上自ajax调用以来经过的时间来“计算当前服务器时间”,那么你就错过了你的请求到达服务器所需的延迟。

假设您在0ms发送请求 - 服务器将在20ms处获取请求并将其当前服务器时间放在响应中。然后你的客户将得到结果,比如50ms。 那么与实际服务器时间相比,计算出的服务器时间将减少20ms。

最终你要做的事情似乎是一种非公平的非最佳实践方法。

也许如果您告诉我们您希望通过这种方法实现什么目标,我们可以帮助您找到更好的解决方案

答案 1 :(得分:0)

您可以将服务器配置为在“日期”标题中返回它的时间 - 这是一个标准的http标头 - 这样您就不需要专门的休息了: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

即便如此,您只会在请求离开服务器时获得时间戳。

如果您遇到与我相同的问题,并且您需要显示自服务器启动以来所经过的时间 - 网络延迟在这里不是什么大问题。 对于任何其他用法,您需要让UTC完成工作。

希望它有所帮助。