获取时间(Objective-c)

我需要得到两个事件之间的时间:例如,在UIView的外观和用户的第一个反应之间。

NSDate *start = [NSDate date]; // do stuff... NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval是开始与现在之间的差异,以秒为单位,精度为亚毫秒。

您不应该依赖[NSDate date]进行计时,因为它可能会超出或低于报告所用时间。 甚至有一些情况下,你的电脑将会看起来像是时间旅行,因为经过的时间是负的! (例如,如果时钟在时间倒退。)

根据Aria Haghighi在2013年冬季斯坦福大学iOS课程 (34:00)的“高级iOS手势识别”讲座,如果您需要精确的时间间隔,您应该使用CACurrentMediaTime()

Objective-C的:

 #import <QuartzCore/QuartzCore.h> 
 CFTimeInterval startTime = CACurrentMediaTime(); // perform some action CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

迅速:

 let startTime = CACurrentMediaTime() // perform some action let elapsedTime = CACurrentMediaTime() - startTime 

原因是[NSDate date]在服务器上同步,因此可能导致“时间同步打嗝”,导致很难跟踪的错误。 另一方面, CACurrentMediaTime()是一个设备时间,不会随着这些networking同步而改变。

您需要将 QuartzCore框架 添加到您的目标设置中。

使用timeIntervalSinceDate方法

 NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval只是一个double NSTimeInterval ,在NSDate定义如下:

 typedef double NSTimeInterval; 

对于任何人来这里寻找一个iOS的getTickCount()实现,这是我的各种来源之后:

 #include <mach/mach.h> #include <mach/mach_time.h> uint64_t getTickCount(void) { static mach_timebase_info_data_t sTimebaseInfo; uint64_t machTime = mach_absolute_time(); // Convert to nanoseconds - if this is the first time we've run, get the timebase. if (sTimebaseInfo.denom == 0 ) { (void) mach_timebase_info(&sTimebaseInfo); } // Convert the mach time to milliseconds uint64_t millis = ((machTime / 1000000) * sTimebaseInfo.numer) / sTimebaseInfo.denom; return millis; } 

对于percise时间测量(如GetTickCount),还可以看看mach_absolute_time和Apple Q&A: http : //developer.apple.com/qa/qa2004/qa1398.html 。

使用下面的NSDate类的timeIntervalSince1970函数:

 double start = [startDate timeIntervalSince1970]; double end = [endDate timeIntervalSince1970]; double difference = end - start; 

基本上,这是我用来比较两个不同date之间的秒差。 也检查这个链接在这里

其他答案是正确的(与警告*)。 我添加这个答案只是为了显示一个示例用法:

 - (void)getYourAffairsInOrder { NSDate* methodStart = [NSDate date]; // Capture start time. // … Do some work … NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time. 

}

在debugging器控制台上,您看到如下所示:

 DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds. 

*注意:正如其他人提到的,使用NSDate来计算仅用于临时目的的经过时间。 一个这样的目的可能是常见的testing,粗略的分析,你只是想粗略地了解一个方法正在使用多长时间。

由于networking时钟同步,设备的时钟当前时间设置可能会随时改变。 所以NSDate时间可以随时跳转或跳转。