客户端时间和服务器时间的区别

4

我希望在一个php/javascript应用程序中使用服务器时间。对于该应用程序,精确到秒的时间非常重要。然而,尽管检查了客户端和服务器时间之间的时间差异,仍然存在3-4秒的差异。

我的Angular代码如下:

 // 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;
        });

理论上这应该可以工作,但是出现了高达四秒的差异。如有建议或代码修改,请不吝赐教。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jay Blanchard
假设每个人都在使用时间服务,这是不太可能的。我可以看出你可能想增加检查时间的频率。但是,你能否指导我如何为它们进行规划? - Simon R
看起来你的timeDifference正在比较客户端时间和服务器时间,也许总是使用服务器时间是一个好习惯。 - Mark Ng
1
是的,但应用程序是通过人们的浏览器推送的,并且具有时间敏感性,因此依赖于在客户端和服务器时间之间进行计算以有效使用服务器时间。 - Simon R
2个回答

3
混合使用客户端和服务器时间不是一个好主意。 客户端时间完全不可靠,因为用户可以随时更改他的时间。如果他觉得有趣,他现在可以把他的时间设为06.06.2066。那么你的程序会怎么做?可能什么好事都没有。 不要混淆这些,最好的方法可能是只使用服务器时间。 除非您只需要计算两个时间点之间的差异以评估持续时间。在这种情况下,您可以使用客户端时间,因为对于时间戳的差值,绝对值并不重要(2016年还是2066年,谁在乎... 3秒就是3秒)。
此外,在您的代码中还存在另一个问题。如果您想通过添加从服务器返回的值和自上次ajax调用以来经过的时间来“计算当前服务器时间”-您将错过请求到达服务器所需的延迟。
比如说,您在0ms发送请求-服务器将在20ms收到请求并将其当前的服务器时间放入响应中。然后,您的客户端将在50ms左右获得结果。 然后,计算出的服务器时间将与实际服务器时间相差20ms。
最终,您试图做的事情似乎是一个非常非最佳实践的方法。 也许,如果您告诉我们您想通过这种方法实现什么,我们可以帮助您找到更好的解决方案。

0

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

即使如此,您仍然只能获得请求离开服务器的时间戳。

如果您和我有相同的问题,并且需要显示自某个时间点以来经过的时间 - 网络延迟在这里并不是很重要。 对于任何其他用途,您需要让UTC处理工作。

希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接