首页 > 代码库 > 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
显示效果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。