1

目前我正在使用十进制分钟记录两个事件之间的时间:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents =  [calendar components:unitFlags fromDate:date];

CGFloat hour = [dateComponents hour];
CGFloat minute = [dateComponents minute];
CGFloat second = [dateComponents second];

//set start time in decimal minutes
CGFloat startTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//do work...

//set end time in decimal minutes
CGFloat endTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//calculate time elapsed in decimal minutes
CGFloat totalTime = endTime-startTime;

我遇到的问题是我真的只能以秒为单位获得时间,然后转换为十进制分钟。所以,我得到的唯一值是0.016663(十进制分钟一秒)、0.033325(十进制分钟两秒)、0.049988(十进制分钟三秒)等。我没有得到介于两者之间的任何值。有什么办法可以得到更准确的时间吗?我检查了是否NSDateComponents有财产millisecond或其他东西,但我找不到任何东西。

谢谢!

4

4 回答 4

6

您还可以使用CFAbsoluteTimeGetCurrent()返回一个包含以秒为单位的时间和几分之一秒的双精度数:

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

然后稍后您可以计算以秒和几分之一秒为单位的经过时间:

elapsed = CFAbsoluteTimeGetCurrent() - startTime;

NSLog(@"Elapsed Time: %0.3f seconds", elapsed);

我喜欢在我的应用程序委托和我的第一个视图控制器的 viewDidAppear 中使用调试代码 (#ifdef DEBUG) 来报告已用的启动时间,这样我就可以在开发时密切关注它。

于 2011-08-25T23:03:06.873 回答
2

为什么不直接使用 NSDate?

NSDate *date1, *date2;
NSTimeInterval timeInSeconds;

date1 = [NSDate date];

// Do work

date2 = [NSDate date];
timeInSeconds = [date2 timeIntervalSinceDate:date1];

// Or, without using date2:

timeInSeconds = -[date1 timeIntervalSinceNow];

这应该会给你的测量亚秒级精度。

于 2011-08-25T21:23:31.487 回答
1

如果你想获得 Unix-y,你可以使用gettimeofday参考):

struct timeval tv;
gettimeofday(&tv, NULL);
NSLog(@"seconds: %d, microseconds: %d\n", tv.tv_sec, tv.tv_usec);

请务必添加#import <sys/time.h>到您的文件中

于 2011-08-25T21:34:55.263 回答
0

或者,如果您真的想了解情况,您可以使用mach_absolute_time(),根据此SO Q/A和/或Apple 文档

于 2013-05-29T18:41:26.440 回答