1

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

想象一个设备,在这种情况下是一台运行现代浏览器的台式电脑。当此用户连接时,它充当主用户。这个主人在 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 beta2),所有从属设备都与主设备完美同步。

正如您在上面的代码中看到的那样,我尝试使用该Date.Now()方法,但无济于事。从监控 node.js 我可以看到服务器正在将正确的推start_time送到我的 iphone 中,但是在移动 safari 中修改变量时的结果似乎每次都会出现几秒钟的不同。

更麻烦的是,我目前无法使用 Apple 计算机,因此无法正确调试移动 Safari 以了解发生了什么。

我完全不知所措,无法理解 Apple 的 javascript Date 实现为何或如何将不同的结果返回给其他浏览器。这没有任何意义。

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

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

编辑: 我刚刚有了一个相当清醒的想法。当您在 javascript 中获取时间时,它是否使用客户端系统时钟?这意味着如果他们离开了几秒钟,这将是不准确的?即主时间可能是 16:31:22 而 iPhone 时间可能是 16:31:16。

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

4

1 回答 1

1

正如我在上面的编辑中提到的,问题原来是由于本地系统时间因设备而异。

我天真地认为这取决于移动 Safari,因为我们拥有的所有桌面设备都是自动时间同步的,因此它们看起来都可以完美运行。

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

结果在所有浏览器/设备上显得完美且一致。

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

于 2013-07-02T11:43:59.270 回答