我有一个奇怪的问题,我完全无法解释。为了描述问题,我需要描述我的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。
如果是这种情况,那么我需要彻底重新思考如何最好地同步这些设备。如果这确实是差异的原因,我当然会接受这个答案。
答案 0 :(得分:1)
正如上面的 EDIT 中提到的,问题原因是不同设备的本地系统时间不同。
我天真地认为它归功于移动游猎,因为我们拥有的所有桌面设备都会自动进行时间同步,因此它们看起来都很完美。
解决方案是在node.js中全局设置开始时间。并计算每个从属系统时间的偏移量。此方法也为所有设备实现了更好的同步,因为我们现在还在测量和抵消每个设备的延迟。
结果在所有浏览器/设备上都显得完美且一致。
虽然我原来的问题很明显是错误的,但我会在这里留下这个答案以防其他人帮助。