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)isToday 12 { 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 return 22 (selfCmps.year == nowCmps.year) && 23 (selfCmps.month == nowCmps.month) && 24 (selfCmps.day == nowCmps.day); 25 } 26 27 /** 28 * 是否为昨天 29 */ 30 - (BOOL)isYesterday 31 { 32 // 2014-05-01 33 NSDate *nowDate = [[NSDate date] dateWithYMD]; 34 35 // 2014-04-30 36 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 *)dateWithYMD 45 { 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)isThisYear 56 { 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 *)deltaWithNow 70 { 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://app.weibo.com/t/feed/3j6BDx" rel="nofollow">孔明社交管理</a>*/ 38 //所需要的:孔明社交管理 39 -(NSString *)source 40 { 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
显示效果:
iOS开发项目篇—45时间和来源处理
时间: 2024-10-17 23:25:03