(僅個人鄙見,如有不同,或效率不高還請指出,謝謝)
最近在寫一個背單詞的app,根據艾賓浩斯曲線來復習強化記憶,需要計算兩次復習的相差天數,正好需要獲取一個(不包含當天時間)的日期
比如我們用 [NSDate date]獲取當前時間,得到的數據如下:
2015-03-13 14:08:55 +0000
很明顯,我只要想要 2015-03-13 00:00:00,它后面還多了 14:08:55 (當天的具體時間),這樣再轉成NSTimeInterval的時候計算兩次時間差有可能不符合我的判別復習要求(即未滿相隔1天/24*60*60 s 或2天..)
那么后期處理僅獲得日期月日年的方法有哪些呢?我個人在寫app的時候想到有兩種簡單的處理方法,稍微比較一下:
法一(不推薦): NSDateFormatter
1 - (NSDate *)extractDate:(NSDate *)date { 2 3 NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; 4 fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CH"]; 5 fmt.dateFormat = @"yyyy.MM.dd"; 6 7 NSString *temp = [fmt stringFromDate:date]; 8 return [fmt dateFromString:temp]; 9 }
如上所示,就是通過NSDateFormatter來略去后半部分
法二(推薦): NSTimeInterval計算
1 - (NSDate *)extractDate:(NSDate *)date { 2 //get seconds since 1970 3 NSTimeInterval interval = [date timeIntervalSince1970]; 4 int daySeconds = 24 * 60 * 60; 5 //calculate integer type of days 6 NSInteger allDays = interval / daySeconds; 7 8 return [NSDate dateWithTimeIntervalSince1970:allDays * daySeconds]; 9 }
這個方法就是先獲得當前時間(包含具體時間)與1970年(1970.1.1)的時間差(單位為second),然后總seconds除以一天的seconds,就能計算出整數天數從而省略了多余的具體時間
然后用Time Profiler來個小測試,用數據說話,看看兩種方法效率哪種高 (同樣1000條數據依次調用此方法)
法一:
64ms,坑爹呀,至少我在測試app時能感覺到片刻的卡頓感,這也說明了NSDateFormatter 的dateFromString效率非常不高呀
法二:
再也沒有出現 extractDate 這個方法占用那么多時間了,主線程總共也才83ms啊!!!很明顯法二勝出