我有一个奇怪的问题,我完全无法解释。为了描述问题,我需要描述我的 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。
如果是这种情况,那么我需要重新考虑如何最好地同步这些设备。如果这确实是造成差异的原因,我当然会接受这个答案。