不同设备的结果不同

首先,我不得不说,我设置date和时间设置自动设置和时区是相同的每个设备。 所以我使用[NSDate date]以毫秒为单位获取时间戳,然后编码到NSData并发送到另一个设备。 接收器上的数据正在被解码,并且与新的[NSDate date]相减。 这样我就可以获得发送和接收消息所需的总时间。 我认为,因为当发件人是iPhone 4的iOS6和接收器是iPhone 5的iOS7,然后接收方比发件人有更早的时间戳。 我不知道为什么? 也许[NSData date]不是那种types的操作最可靠的类? 我使用GCDAsyncUdpSocket发送/接收UDP。

代码发送者

 NSData *data2 = [self createRandomNSData:8192]; NSMutableData *dataToSend =[NSMutableData data]; [dataToSend appendBytes:&tag length:sizeof(int)]; long long currentTimeStamp = (long long)([[NSDate date] timeIntervalSince1970]*1000.0); [dataToSend appendBytes:&currentTimeStamp length:sizeof(long long)]; [dataToSend appendData:data2]; NSLog(@"%i || %lld || %lu",tag, currentTimeStamp,(unsigned long)[dataToSend length]); [_udpSocket sendData:dataToSend toHost:@"230.0.0.1" port:_port withTimeout:-1 tag:tag]; tag++; 

代码接收器

 char* dataBytes = [data bytes]; int inTag; long long inCurrentTimeStamp; [data getBytes:&inTag length:sizeof(int)]; [data getBytes:&inCurrentTimeStamp range:NSMakeRange(sizeof(int), sizeof(long long))]; long long currentTimeStamp = (long long)([[NSDate date] timeIntervalSince1970]*1000.0); long long timeStampDiff = currentTimeStamp - inCurrentTimeStamp; self.delay = timeStampDiff; NSLog(@"%i || %lld || %lu",inTag, timeStampDiff,(unsigned long)[data length]); 

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"MM/dd/yyyy hh:mm:ss"]; [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; NSString *strSystemTime = [dateFormatter stringFromDate:[NSDate date]]; 

我面临同样的问题,并通过设置NSLocale解决它。 我希望这个解决scheme也适用于你。

不要使用长时间的NSDate的timeIntervalSince1970 * 1000.使用timeIntervalSince1970直接表示为double,直接。 这将保存date的所有决议。

只需将字节添加到sizeof(double)的数据中即可。

在发送之前loggingdouble值和它的字节stream,在远程设备上loggingdouble值和接收到的字节stream,并将它们进行比较。

如果两台设备都是同一networking上的电话,并且他们自动设置时钟(设置>常规>date和时间),那么他们的时钟应该在几分之一秒内同步。

接收器上的数据正在解码,并用新的[NSDate date]

那就是问题所在。 它与设备上安装的iOS版本无关:一般来说,如果您的时间戳是由不同的计算机生成的,则不能将其相减,并期望得到任何精度,因为设备时钟不同步足以测量networking延迟,因为时钟歪斜 。

考虑一下这个简单的例子:假设Alice和Bob电脑上的时钟相隔10秒,当Alice的时钟显示12:00:00时,Bob的时钟显示12:00:10。

Alice向Bob发送时间戳,表示14:23:06。 它需要一秒钟的包裹到达鲍勃,现在鲍勃看到包裹到达时14:23:17。 如果鲍勃简单地从自己的时间戳中减去爱丽丝的时间戳,他会得出结论,该包花了11秒才能达到它。

如果鲍勃现在给艾丽丝发送他的时间戳 – 假设是14:23:18,艾丽斯会在一秒钟之后收到,艾丽丝的时钟将是14:23:09。 现在爱丽丝会得出这样的结论:包裹拿着-9(是的, 消极的九! )秒达到它,根本没有意义。

幸运的是,如果假定双向延迟是相同的,则可以通过分解时钟偏差来测量延迟。 这个想法是获得两对时间戳,这样的时钟偏移是两个对中的一个因子,但是偏斜的符号是相反的。

考虑上面例子中的时间戳:

 A1=14:23:06 B1=14:23:17 B2=14:23:18 A2=14:23:09 

每一对,A1-B1和B2-A2,包含歪斜,但在第一对歪斜是积极的,而在第二对是负面的。 因此,如果你平均两个时间差,你会最终往返延迟

 ((B1-A1)+(A2-B2)) / 2 = (11 + -9) / 2 = 2 / 2 = 1 second 

这应该足以让您实现一个简单的程序来测量系统中的往返延迟。

 long intervalValue= (long)([[NSDate date] timeIntervalSince1970]); NSString *intervalString =[NSString stringWithFormat:@"%ld",intervalValue]; int dif=13-[intervalString length]; for (int k=0; k<dif; k++) { intervalString=[NSString stringWithFormat:@"%@0",intervalString]; } unsigned long long convertedValue=[intervalString longLongValue]+0530;