框架层:
NSDate 属于Foundation
CFAbsoluteTimeGetCurrent() 属于 CoreFoundatio
CACurrentMediaTime() 属于 QuartzCore
mach_absolute_time属于mach/mach_time
本质区别:
NSDate 或 CFAbsoluteTimeGetCurrent() 返回的时钟时间将会会网络时间同步,从时钟 偏移量的角度,mach_absolute_time() 和 CACurrentMediaTime() 是基于内建时钟的,能够更精确更原子化地测量,并且不会因为外部时间变化而变化(例如时区变化、夏时制、秒突变等),但它和系统的uptime有关,系统重启后CACurrentMediaTime()会被重置。
NSDate 和 dateWithTimeIntervalSince1970 是 NSDate的时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,是以秒为单位。常用于时间获取和计算,精确度低,有的时候可能会出现偏差的时候,比如说可能慢了两秒啊,快了两秒啊。
CFAbsoluteTimeGetCurrent()和[NSDate timeIntervalSinceReferenceDate] 都是以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔,是以秒为单位。常用于时间获取和计算,精确度低,有的时候可能会出现偏差的时候,比如说可能慢了两秒啊,快了两秒啊。
CACurrentMediaTime 返回的就是开机后设备一共运行了(设备休眠不统计在内)多少秒,是以秒为单位。只受设备重启和休眠行为影响。重启后重置。经常被用于测试代码的效率。
mach_absolute_time是一个CPU/总线依赖函数,返回一个基于系统启动后的时钟"嘀嗒"数。在macOS上可以确保它的行为,并且,它包含系统时钟所包含的所有时间区域。单位是纳秒,1纳秒等于10的负9次方秒,精度高。是CACurrentMediaTime的基础。经常被用于经常被用于测试代码的效率。
个人推荐:
测试代码的效率用mach_absolute_time理由是精度高。
时间点获取用CFAbsoluteTimeGetCurrent理由是少计算30年的时间。
使用:
NSDate:
1.基本当前时间
```
-(NSString*)getCurrentTimes{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
//现在时间,你可以输出来看下是什么格式
NSDate *datenow = [NSDate date];
//----------将nsdate按formatter格式转成nsstring
NSString *currentTimeString = [formatter stringFromDate:datenow];
NSLog(@"currentTimeString = %@",currentTimeString);
return currentTimeString;
}
二、分别单独获得
————————————————
版权声明:本文为CSDN博主「奔跑的Yancy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lyxleft/article/details/79226774
```
2.
NSTimeInterval ChuoEndTime= [[NSDate date] timeIntervalSince1970];
double time = [[NSString stringWithFormat:@"%f",ChuoEndTime] doubleValue];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:time];
NSDateFormatter *formatter = [NSDateFormatter new];
[formattersetDateFormat:@"YYYY-MM-dd HH:mm"];
//将时间转换为字符串
NSString*timeS = [formatterstringFromDate:myDate];
NSLog(@"时间戳转时间%@",timeS);
获取指定递减时间的日,月,年数组:
@property (nonatomic,strong) NSArray *dataSource;
- (NSArray*)datesForFirstFewDaysWithFormat:(NSInteger)dateType{
NSMutableArray *aMArray = [NSMutableArray array];
for(NSIntegeri =_dataSource.count; i >0; i --) {
//得到当前的时间
NSDate* mydate = [NSDatedate];
NSDateFormatter* dateFormatter = [[NSDateFormatteralloc]init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents*comps =nil;
comps = [calendarcomponents:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitMonth fromDate:mydate];
NSDateComponents *adcomps = [[NSDateComponents alloc] init];
if(dateType==0) {
[dateFormattersetDateFormat:@"MM-dd"];
[adcompssetYear:0];
[adcompssetMonth:0];
[adcompssetDay:-i];
}elseif(dateType==1)
{
[dateFormattersetDateFormat:@"yyyy-MM"];
[adcompssetYear:0];
[adcompssetMonth:-i];
[adcompssetDay:0];
}elseif(dateType==2){
[dateFormattersetDateFormat:@"yyyy"];
[adcompssetYear:-i];
[adcompssetMonth:0];
[adcompssetDay:0];
}
NSDate*newdate = [calendardateByAddingComponents:adcompstoDate:mydateoptions:0];
NSString*beforDate = [dateFormatterstringFromDate:newdate];
[aMArrayaddObject:beforDate];
}
returnaMArray;
}
CFAbsoluteTimeGetCurrent:
其中 CFAbsoluteTimeGetCurrent() 相当于[[NSDate data] timeIntervalSinceReferenceDate];
double date_s = CFAbsoluteTimeGetCurrent();
NSDate *myDate = [NSDate dateWithTimeIntervalSinceReferenceDate:date_s];
NSDateFormatter *formatter = [NSDateFormatter new];
[formattersetDateFormat:@"YYYY-MM-dd HH:mm"];
//将时间转换为字符串
NSString*timeS = [formatterstringFromDate:myDate];
NSLog(@"时间戳转时间%@",timeS);
CACurrentMediaTime:
for循环之间的就是测的代码运行了多少秒。
double date_sN = CACurrentMediaTime();
for(inti =0;i < test.count; i++) {
sum +=1;
}
double date_e = CACurrentMediaTime();
NSLog(@"ForLoop Time: %f", date_e - date_sN);
mach_absolute_time:
for循环之间的就是测的代码运行了多少纳秒。
@property(nonatomic,assign)UInt64 start;
@property(nonatomic,assign)UInt64 end;
_start =mach_absolute_time();
for(inti =0;i < test.count; i++) {
sum +=1;
}
_end =mach_absolute_time();
NSLog(@"--------%lli",_end-_start);