(仅个人鄙见,如有不同,或效率不高还请指出,谢谢)
最近在写一个背单词的app,根据艾宾浩斯曲线来复习强化记忆,需要计算两次复习的相差天数,正好需要获取一个(不包含当天时间)的日期
比如我们用 [NSDate date]获取当前时间,得到的数据如下:
2015-03-13 14:08:55 +0000
很明显,我只要想要 2015-03-13,它后面还多了 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啊!!!很明显法二胜出
时间: 2024-10-14 18:42:30