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)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时间和来源处理,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。