同时生成 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 导致不同的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章

批量动态新增分区表

使用不同的日历标识符格式化 NSDate?

如何计算不同时区的两个 NSDate 对象之间的天数差异?

NSManagedObject 的日期与 NSDate 的 Xcode 9 构建问题

生成不同整数的树会导致空间泄漏

如何使 NSDate 与关联对象一起工作?