同时生成 NSDate 导致不同的时间间隔
Posted
技术标签:
【中文标题】同时生成 NSDate 导致不同的时间间隔【英文标题】:Simultaneous NSDate generation leading to different time intervals 【发布时间】:2014-04-08 16:46:12 【问题描述】:在使用蓝牙连接(GameKit,特别是为了兼容 ios6)的服务器-客户端游戏中,当点击每个客户端上的按钮时,1 个或多个客户端设备 (iPhone/iTouch) 会向服务器设备 (iPad) 发送时间戳.即每个客户调用:
[[NSDate date] timeIntervalSince1970]
...然后将值作为NSData
有效负载发送到服务器。
只有1个客户端连接时,生成并发送到服务器的时间与物理点击的时间相同。当连接 2 个或更多客户端时,即使所有客户端同时被点击,生成的时间也会有很大差异,例如
同时点击客户端 1 和 2:
客户端 1 时间戳 = 1396974546.558433(自 1970 年以来的时间间隔) 客户端 2 时间戳 = 1396974551.274747(自 1970 年以来的时间间隔)即客户端 2 不知何故比客户端 1 晚了 5 秒。虽然我会接受几毫秒的差异,因为真正同时点击很难,但多秒是不可接受的。添加额外的客户端会产生或多或少的随机时间差异,但通常是几秒钟。
为了让事情变得更加神秘,时间戳在客户端生成的方式不同:服务器接收到的时间戳与客户端生成的时间戳相同(即,这不是发生的事情在运输途中或收货时)。
我不知道是什么原因造成的。有什么想法吗?
【问题讨论】:
转到两个客户端的主屏幕并查看时钟应用程序图标。秒针是同步的还是相差 5 秒? 【参考方案1】:[[NSDate date] timeIntervalSince1970]
与设备上设置的时间相关,因此您不能依赖两个设备向您的服务器发送相同的时间。
我在使用 Multipeer Connectivity 开发东西时遇到了类似的问题,最后我使用了一个名为 ios-ntp 的库,它使用来自多个 NTP 服务器的时间信息以及请求本身的延迟来推导准确的时间。对我来说效果很好。
【讨论】:
【参考方案2】:我的猜测是,无论出于何种原因,这些设备都会间隔 5 秒
我之所以这么说是因为
[[NSDate date] timeIntervalSince1970]
通常具有亚毫秒精度
【讨论】:
是的,你是对的。根据 ChrisH 的回答,设备上的时钟没有同步。我使用 ios-ntp 缩小差距,虽然并不完美。以上是关于同时生成 NSDate 导致不同的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章