为什么移动safari似乎给出了与桌面浏览器不同的Javascript Date()结果

Why does mobile safari seem to give different Javascript Date() results from desktop browsers?

本文关键字:Javascript Date 结果 浏览器 桌面 safari 移动 为什么      更新时间:2023-09-26

我有一个奇怪的问题,我完全无法解释。为了描述这个问题,我需要描述我的网络应用程序的这个特定部分的流程。

想象一下一台设备,在这种情况下是一台运行现代浏览器的台式电脑。当该用户连接时,它充当主用户。这个master在javascript中检索当前时间,比如:

get_time : function() {
              var d = new Date();
              return d.getTime() - this.cache.start_time;
              //We have tried using the modern Date.now method also but to no avail
              //return Date.now() - this.cache.start_time;
},

这个时间通过一个websocket发送到node.js中,并临时存储在该特定流的服务器端。

现在想象一下其他几种设备,混合了手机、平板电脑和其他台式电脑。这些设备本质上成为了主设备的奴隶,我们要求它们在时间上同步。为了实现这一点,当这些从服务器连接时,node.js服务器将保存的start_time从该流的主服务器推送到从服务器。

这个变量变成了属性this.cache.start_time,可以在上面的函数中看到。

从这个开始时间开始,通过从开始时间减去从属浏览器中的当前时间来进行切分。

需要这样做的原因与这个问题无关,因此我将省略它们。然而,我将添加一点细节,解释一下每个从机上正在进行的处理,只需要从与主机当前处理的数组索引完全相同的数组索引开始。通过在主节点及其所有从属节点上同步start_time变量,我们可以获得正确的数组索引,并从中开始基于时间的处理。

我遇到的问题是,在我尝试的每一个浏览器中,除了移动Safari(我已经测试了iOS 6和iOS 7测试版2),所有的从属浏览器都与主浏览器完美同步。

正如您在上面的代码中看到的,我尝试使用Date.Now()方法,但没有成功。通过监控node.js,我可以看到服务器正在将正确的start_time推送到我的iphone中,但在移动safari中修改变量时的结果似乎每次都会有几秒钟的不同。

更困难的是,我目前无法访问苹果电脑,因此无法正确调试移动Safari以了解发生了什么。

我完全不知所措,无法理解苹果的javascript Date实现为什么或如何会给其他浏览器带来不同的结果。这根本没有道理。

关于使用移动Safari,是否有我不知道的地方?苹果用javascript获取当前时间的方法有什么已知的区别吗?对于如何准确地收集跨浏览器一致的当前时间,还有其他建议吗?

提前感谢您的任何建议或建议。

编辑:我刚刚有了一个相当发人深省的想法。当你用javascript获取时间时,它会使用客户端系统时钟吗?这意味着,如果他们只落后几秒钟,这将是不准确的?即Master时间可能是16:31:22,而iPhone时间可能是16时31:16。

如果是这样的话,那么我需要重新思考如何最好地同步这些设备。如果这确实是造成差异的原因,我当然会接受这个答案。

正如我在上面的EDIT中提到的,问题是由于不同设备的本地系统时间不同。

我天真地认为这是因为移动狩猎,因为我们所有的桌面设备都是自动时间同步的,所以它们看起来都很完美。

解决方案是从node.js中全局设置开始时间。并计算每个从属系统时间的偏移量。此外,这种方法为所有设备实现了更好的同步,因为我们现在也在测量和偏移每个设备的延迟。

结果在所有浏览器/设备上都是完美一致的。

虽然我最初的问题显然是错误的,但我会把这个答案留在这里,以防对其他人有帮助。