5

首先,我不得不说我在日期和时间设置中设置了自动设置,并且每个设备的时区都是相同的。所以我使用[NSDate date]以毫秒为单位获取时间戳,然后编码NSData并发送到另一个设备。在接收器上,数据正在被解码并用 new 减去[NSDate date]。这样我就可以获得发送和接收消息所需的总时间。我被认为是因为当发送者是 iPhone 4 iOS6 而接收者是 iPhone 5 iOS7 时,接收者的时间戳比发送者早。我不知道为什么?对于这种操作,也许[NSData date]不是最可靠的类?我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]);
4

4 回答 4

7
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解决了它。我希望这个解决方案也适合你。

于 2013-12-18T05:46:54.280 回答
2

不要使用 NSDate 的 timeIntervalSince1970 * 1000 的 long long。直接使用表示为 double 的 timeIntervalSince1970。这将保存日期的所有分辨率。

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

在发送前记录双精度值及其字节流,并在远程设备上记录双精度值及其接收字节流并进行比较。

如果两个设备都是同一网络上的电话,并且您让它们自动设置时钟(设置>常规>日期和时间),那么它们的时钟应在几分之一秒内同步。

于 2013-12-06T14:19:22.693 回答
1

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

那就是问题所在。它与设备上安装的 iOS 版本无关:通常,如果您的时间戳是由不同的计算机生成的,则不能减去它们,并期望从中得到任何精度,因为设备时钟不同步由于时钟偏差,足以测量网络延迟。

考虑这个简单的例子:假设计算机上的时钟 Alice 和 Bob 相隔 10 秒:当 Alice 的时钟显示为 12:00:00 时,Bob 的时钟显示为 12:00:10。

Alice 向 Bob 发送其时间戳,即 14:23:06。包裹到达 Bob 需要一秒钟,现在 Bob 看到包裹到达的时间是 14:23:17。如果 Bob 只是简单地从他自己的时间戳中减去 Alice 的时间戳,他会得出结论,包裹需要 11 秒才能到达。

如果 Bob 现在向 Alice 发送他的时间戳——假设它是 14:23:18,Alice 会在一秒钟后收到它,按照 Alice 的时钟应该是 14:23:09。现在 Alice 会得出结论,包裹需要 -9(是的,负 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

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

于 2013-12-17T22:04:15.873 回答
0
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;
于 2013-12-17T12:51:16.313 回答