框架層:
NSDate 屬于Foundation
CFAbsoluteTimeGetCurrent() 屬于 CoreFoundatio
CACurrentMediaTime() 屬于 QuartzCore
mach_absolute_time屬于mach/mach_time
本質(zhì)區(qū)別:
NSDate 或 CFAbsoluteTimeGetCurrent() 返回的時(shí)鐘時(shí)間將會(huì)會(huì)網(wǎng)絡(luò)時(shí)間同步,從時(shí)鐘 偏移量的角度,mach_absolute_time() 和 CACurrentMediaTime() 是基于內(nèi)建時(shí)鐘的,能夠更精確更原子化地測(cè)量,并且不會(huì)因?yàn)橥獠繒r(shí)間變化而變化(例如時(shí)區(qū)變化、夏時(shí)制、秒突變等),但它和系統(tǒng)的uptime有關(guān),系統(tǒng)重啟后CACurrentMediaTime()會(huì)被重置。
NSDate 和 dateWithTimeIntervalSince1970 是 NSDate的時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù),是以秒為單位。常用于時(shí)間獲取和計(jì)算,精確度低,有的時(shí)候可能會(huì)出現(xiàn)偏差的時(shí)候,比如說(shuō)可能慢了兩秒啊,快了兩秒啊。
CFAbsoluteTimeGetCurrent()和[NSDate timeIntervalSinceReferenceDate]? 都是以2001/01/01 GMT為基準(zhǔn)時(shí)間,返回實(shí)例保存的時(shí)間與2001/01/01 GMT的時(shí)間間隔,是以秒為單位。常用于時(shí)間獲取和計(jì)算,精確度低,有的時(shí)候可能會(huì)出現(xiàn)偏差的時(shí)候,比如說(shuō)可能慢了兩秒啊,快了兩秒啊。
CACurrentMediaTime?返回的就是開(kāi)機(jī)后設(shè)備一共運(yùn)行了(設(shè)備休眠不統(tǒng)計(jì)在內(nèi))多少秒,是以秒為單位。只受設(shè)備重啟和休眠行為影響。重啟后重置。經(jīng)常被用于測(cè)試代碼的效率。
mach_absolute_time是一個(gè)CPU/總線依賴函數(shù),返回一個(gè)基于系統(tǒng)啟動(dòng)后的時(shí)鐘"嘀嗒"數(shù)。在macOS上可以確保它的行為,并且,它包含系統(tǒng)時(shí)鐘所包含的所有時(shí)間區(qū)域。單位是納秒,1納秒等于10的負(fù)9次方秒,精度高。是CACurrentMediaTime的基礎(chǔ)。經(jīng)常被用于經(jīng)常被用于測(cè)試代碼的效率。
個(gè)人推薦:
測(cè)試代碼的效率用mach_absolute_time理由是精度高。
時(shí)間點(diǎn)獲取用CFAbsoluteTimeGetCurrent理由是少計(jì)算30年的時(shí)間。
使用:
NSDate:
1.基本當(dāng)前時(shí)間
```
-(NSString*)getCurrentTimes{
? ? NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
? ? // ----------設(shè)置你想要的格式,hh與HH的區(qū)別:分別表示12小時(shí)制,24小時(shí)制
? ? [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
? ? //現(xiàn)在時(shí)間,你可以輸出來(lái)看下是什么格式
? ? NSDate *datenow = [NSDate date];
? ? //----------將nsdate按formatter格式轉(zhuǎn)成nsstring
? ? NSString *currentTimeString = [formatter stringFromDate:datenow];
? ? NSLog(@"currentTimeString =? %@",currentTimeString);
? ? return currentTimeString;
}
二、分別單獨(dú)獲得
————————————————
版權(quán)聲明:本文為CSDN博主「奔跑的Yancy」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接: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"];
? ? //將時(shí)間轉(zhuǎn)換為字符串
? ? NSString*timeS = [formatterstringFromDate:myDate];
? ? NSLog(@"時(shí)間戳轉(zhuǎn)時(shí)間%@",timeS);
獲取指定遞減時(shí)間的日,月,年數(shù)組:
@property (nonatomic,strong) NSArray *dataSource;
- (NSArray*)datesForFirstFewDaysWithFormat:(NSInteger)dateType{
? ? NSMutableArray *aMArray = [NSMutableArray array];
? ? for(NSIntegeri =_dataSource.count; i >0; i --) {
? ? ? ? //得到當(dāng)前的時(shí)間
? ? ? ? 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()?相當(dāng)于[[NSDate data] timeIntervalSinceReferenceDate];
? ? double date_s = CFAbsoluteTimeGetCurrent();
?NSDate *myDate = [NSDate dateWithTimeIntervalSinceReferenceDate:date_s];
? ? NSDateFormatter *formatter = [NSDateFormatter new];
? ? ? [formattersetDateFormat:@"YYYY-MM-dd HH:mm"];
? ? //將時(shí)間轉(zhuǎn)換為字符串
? ? NSString*timeS = [formatterstringFromDate:myDate];
? ? NSLog(@"時(shí)間戳轉(zhuǎn)時(shí)間%@",timeS);
CACurrentMediaTime:
for循環(huán)之間的就是測(cè)的代碼運(yùn)行了多少秒。
? 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循環(huán)之間的就是測(cè)的代碼運(yùn)行了多少納秒。
@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);