首页 > 代码库 > iOS开发项目篇—45时间和来源处理

iOS开发项目篇—45时间和来源处理

iOS开发项目篇—45时间和来源处理

一、时间的处理

1.简单说明
系统返回的时间是欧美通用的时区时间,需要进行处理和调整。
根据微博发送的时间和当前的时间进行比较,显示“刚刚”、“一小时前”、“一天前”等。
时间处理的情况:
(1)今年
1)今天
1>1分钟内:刚刚
2>1个小时内:XX分钟前
2)昨天
XX:XX
3)至少是前天发的
07-12 XX:XX
 
(2)非今年
2012-02-11
 
2.解决思路:重写微博创建时间的get方法,可以把有关时间细节的踔厉隐藏在模型中完成。

 (1)时间的处理示例

(2)使用一个日期处理的分类

NSDate+MJ.h文件

 1 // 2 //  NSDate+MJ.h 3 // 4  5 #import <Foundation/Foundation.h> 6  7 @interface NSDate (MJ) 8 /** 9  *  是否为今天10  */11 - (BOOL)isToday;12 /**13  *  是否为昨天14  */15 - (BOOL)isYesterday;16 /**17  *  是否为今年18  */19 - (BOOL)isThisYear;20 21 /**22  *  返回一个只有年月日的时间23  */24 - (NSDate *)dateWithYMD;25 26 /**27  *  获得与当前时间的差距28  */29 - (NSDateComponents *)deltaWithNow;30 @end

NSDate+MJ.m文件

 1 // 2 //  NSDate+MJ.m 3 // 4  5 #import "NSDate+MJ.h" 6  7 @implementation NSDate (MJ) 8 /** 9  *  是否为今天10  */11 - (BOOL)isToday12 {13     NSCalendar *calendar = [NSCalendar currentCalendar];14     int unit = NSCalendarUnitDay | NSCalendarUnitMonth |  NSCalendarUnitYear;15     16     // 1.获得当前时间的年月日17     NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];18     19     // 2.获得self的年月日20     NSDateComponents *selfCmps = [calendar components:unit fromDate:self];21     return22     (selfCmps.year == nowCmps.year) &&23     (selfCmps.month == nowCmps.month) &&24     (selfCmps.day == nowCmps.day);25 }26 27 /**28  *  是否为昨天29  */30 - (BOOL)isYesterday31 {32     // 2014-05-0133     NSDate *nowDate = [[NSDate date] dateWithYMD];34     35     // 2014-04-3036     NSDate *selfDate = [self dateWithYMD];37     38     // 获得nowDate和selfDate的差距39     NSCalendar *calendar = [NSCalendar currentCalendar];40     NSDateComponents *cmps = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];41     return cmps.day == 1;42 }43 44 - (NSDate *)dateWithYMD45 {46     NSDateFormatter *fmt = [[NSDateFormatter alloc] init];47     fmt.dateFormat = @"yyyy-MM-dd";48     NSString *selfStr = [fmt stringFromDate:self];49     return [fmt dateFromString:selfStr];50 }51 52 /**53  *  是否为今年54  */55 - (BOOL)isThisYear56 {57     NSCalendar *calendar = [NSCalendar currentCalendar];58     int unit = NSCalendarUnitYear;59     60     // 1.获得当前时间的年月日61     NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];62     63     // 2.获得self的年月日64     NSDateComponents *selfCmps = [calendar components:unit fromDate:self];65     66     return nowCmps.year == selfCmps.year;67 }68 69 - (NSDateComponents *)deltaWithNow70 {71     NSCalendar *calendar = [NSCalendar currentCalendar];72     int unit = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;73     return [calendar components:unit fromDate:self toDate:[NSDate date] options:0];74 }75 @end

(3)重写get方法,在该方法中的处理细节(导入并使用了分类)

 1 //重写创建时间的get方法 2 /**_created_at==Sat Jul 19 15:24:04 +0800 2014*/ 3 -(NSString *)created_at 4 { 5     NSDateFormatter *fmt=[[NSDateFormatter alloc]init]; 6     //时间格式 7     fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; 8     //获得尾部发布的具体时间 9     NSDate *creatDate = [fmt dateFromString:_created_at];10     11     //判断是否为今年12     if (creatDate.isThisYear) {//今年13         if (creatDate.isToday) {14             //获得微博发布的时间与当前时间的差距15             NSDateComponents *cmps=[creatDate deltaWithNow];16             if (cmps.hour>=1) {//至少是一个小时之前发布的17                 return [NSString stringWithFormat:@"%d小时前",cmps.hour];18             }else if(cmps.minute>=1){//1~59分钟之前发布的19                 return [NSString stringWithFormat:@"%d分钟前",cmps.minute];20             }else{//1分钟内发布的21                 return @"刚刚";22             }23         }else if(creatDate.isYesterday){//昨天发的24             fmt.dateFormat=@"昨天 HH:mm";25             return [fmt stringFromDate:creatDate];26         }else{//至少是前天发布的27             fmt.dateFormat=@"MM-dd HH:mm";28             return [fmt stringFromDate:creatDate];29         }30     }else           //  往年31     {32         fmt.dateFormat=@"yyyy-MM-dd";33         return [fmt stringFromDate:creatDate];34     }35 }

实现效果:

(4)补充

  对于昨天,前天,一年前等发送的微博,可以自己创建条件(修改时间)验证代码是否正确

1)非今年的设置和显示效果

2)设置创建时间为昨天,显示效果如下:

 

二、微博来源的处理

打印查看新浪官方返回的数据

 

设置微博来源采取的解决办法:截取字符串中的子串

 1 //重写创建时间的get方法 2 /**_created_at==Sat Jul 19 15:24:04 +0800 2014*/ 3 -(NSString *)created_at 4 { 5     _created_at=@"Sat Jul 18 15:24:04 +0800 2014"; 6     NSDateFormatter *fmt=[[NSDateFormatter alloc]init]; 7     //时间格式 8     fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; 9     //获得尾部发布的具体时间10     NSDate *creatDate = [fmt dateFromString:_created_at];11     12     //判断是否为今年13     if (creatDate.isThisYear) {//今年14         if (creatDate.isToday) {15             //获得微博发布的时间与当前时间的差距16             NSDateComponents *cmps=[creatDate deltaWithNow];17             if (cmps.hour>=1) {//至少是一个小时之前发布的18                 return [NSString stringWithFormat:@"%d小时前",cmps.hour];19             }else if(cmps.minute>=1){//1~59分钟之前发布的20                 return [NSString stringWithFormat:@"%d分钟前",cmps.minute];21             }else{//1分钟内发布的22                 return @"刚刚";23             }24         }else if(creatDate.isYesterday){//昨天发的25             fmt.dateFormat=@"昨天 HH:mm";26             return [fmt stringFromDate:creatDate];27         }else{//至少是前天发布的28             fmt.dateFormat=@"MM-dd HH:mm";29             return [fmt stringFromDate:creatDate];30         }31     }else           //  往年32     {33         fmt.dateFormat=@"yyyy-MM-dd";34         return [fmt stringFromDate:creatDate];35     }36 }37 /**_source== <a href="http://www.mamicode.com/http://app.weibo.com/t/feed/3j6BDx" rel="nofollow">孔明社交管理</a>*/38 //所需要的:孔明社交管理39 -(NSString *)source40 {41     //截取字符串,获得子串42     //截取的范围43     NSRange range;44     //截取的位置:第一个>之后45     range.location=[_source rangeOfString:@">"].location+1;46     //截取的长度:第二个<的位置到第一个>之间的长度47     range.length=[_source rangeOfString:@"</"].location-range.location;48     49     //开始截取50     NSString *subSource=[_source substringWithRange:range];51     //头部拼接“来自”52     return [NSString stringWithFormat:@"来自%@",subSource];53 }54 55 @end

显示效果: