你的位置:首页 > 操作系统

[操作系统]NSDate仅获取日期年月日的实现


(仅个人鄙见,如有不同,或效率不高还请指出,谢谢)

最近在写一个背单词的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 19703   NSTimeInterval interval = [date timeIntervalSince1970];4   int daySeconds = 24 * 60 * 60;5   //calculate integer type of days6   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啊!!!很明显法二胜出