NSDate仅获取日期年月日的实现--即只要年月日,不要多余的小时分钟秒数

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

最近在写一个背单词的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啊!!!很明显法二胜出

 

posted @ 2015-03-13 22:51  ShawnFoo  阅读(2691)  评论(2编辑  收藏  举报