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时间和来源处理

时间: 2024-10-17 23:25:03

iOS开发项目篇—45时间和来源处理的相关文章

iOS开发项目篇—46时间和来源的处理(cell的复用问题)

iOS开发项目篇—46时间和来源的处理(cell的复用问题)一.简单说明 1.存在的问题:             2.问题描述: 刷新微博界面后,展示的最新的微博数据时间显示为“刚刚”,在项目中对时间进行设计的时候,如果是在1分钟之内发表的,那么显示为“刚刚”.查看后面的微博数据后,回过头来(1分钟已经过去了),此时之前显示为“刚刚”的微博,应该显示XX分钟以前,确实显示了,但是时间的frame不正确(此时的frame=="刚刚"两个字的frame). 提示:cell的复用问题,为了

iOS开发项目篇—47Toolbar工具条

iOS开发项目篇—47Toolbar工具条 一.基本设置 说明:完成微博cell中toolbar的基本设置(转发数.评论数.赞) 实现代码: YYStatusToolbar.m文件 1 // 2 // YYStatusToolbar.m 3 // 4 5 #import "YYStatusToolbar.h" 6 7 @interface YYStatusToolbar () 8 /**用来保存两条竖线*/ 9 @property(nonatomic,strong)NSMutableA

iOS开发项目篇—24字典转模型

iOS开发项目篇—24字典转模型 一.直接使用字典转模型 1.微博数据转模型示意图: 2.字典转模型 查询字段: 新建需要的数据模型: 字典转模型相关的代码: YYUserModel.h文件 1 // 2 // YYUserModel.h 3 // 4 5 #import <Foundation/Foundation.h> 6 7 @interface YYUserModel : NSObject 8 9 /** string 友好显示名称*/ 10 @property(nonatomic,c

iOS开发项目篇—44会员处理

iOS开发项目篇—44会员处理 一.简单说明 查看已经完成的效果: 存在的问题和调整: (1)时间和昵称之间的间距较大,调整*0.5. (2)转发微博的用户昵称和微博正文间距较大,调整(2). (3).微博来源设置为亮灰色 打开微博来源,修改之前存在的一个bug. 设置颜色为亮灰色 (4).设置时间字体为橙色. 上面一系列调整完成之后的显示效果为: 二.会员设置 1.说明 微博的用户分为会员和非会员,而根据是否是会员,用户昵称的颜色也不一样,会员显示为橙色,普通用户显示为黑色. 哪些属性是何用户

iOS开发项目篇—43子控件的细节处理

iOS开发项目篇—43子控件的细节处理 一.升级UI 把之前的UI图片删除,换上新的图片(图片命名一致,规范)没有其他的影响. 删除之后,添加. 替换之后,做一次clear操作. 建议把沙盒中的包删除,删除之后再做一次clear操作. 二.调整转发(模块) 1.设置背景(使用提供的素材图片进行平铺) 为转发微博部分设置背景,考虑到这个部分整体上是一个UIView,可以尝试以下设置. 第一种尝试: 但是这样设置,因为图片是平铺的,所以整个背景会出现线条效果,影响显示,不可行. 第二种尝试: 注意:

iOS开发项目篇—41cell的frame设计

iOS开发项目篇—41cell的frame设计 一.简单说明 1.分层设计 在进行设计的时候,建议先分析整个cell的结构,确定了cell由哪些模块构成之后,再进一步确定每个模块中包含的子控件. 在这个微博的cell中,把这个cell分成两个大的模块.分解结构如下: 1.微博完整内容模块View (1)原创微博view 1)头像imageView 2)自己的昵称label 3)发布的时间label 4)微博来源label 5)微博的正文 (2)转发微博 1)原作者的昵称label 2)转发的微博

iOS开发项目篇—41cell的frame的细节处理

iOS开发项目篇—41cell的frame的细节处理 一.简单说明 在首页控制器中使用自定义的UITableViewcell 代码如下: YYHomeTableViewController.m文件 1 // 2 // YYHomeTableViewController.m 3 // 4 5 #import "YYHomeTableViewController.h" 6 #import "YYOneViewController.h" 7 #import "Y

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s