用NSCalendar处理类似微博发帖时间并封装

服务器返回数据

服务器返回数据往往是一整串时间, 放在发帖时间label上面太长不好看, 我们需要手动处理一下使其变得美观易读.

代码

Date+Category封装

需要处理服务器返回一大段时间, 我们需要比较现在时间和发帖时间
首先利用日期格式化类NSDateFormatter去格式化服务器返回的一长串时间字符串.

    //日期格式化类
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //设置日期格式
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    (...此处省略其他代码)

如果直接将以上代码放在cell里面读取会使cell里setModel方法显得冗长, 不美观, 我选择将它们封装起来. 为了便于其他人维护, 不再新建一类, 直接用date+category增加方法.
在date+category方法中自己写入方法:- (NSDateComponents *)zyn_deltaFromDateString:(NSString *)dateString withDateFormat:(NSString *)dateFormat;
然后实现

/**
 比较传入时间和现在时间的差值
 
 @param dateString 获取的时间字符串
 @param dateFormat 字符串时间格式
 
 @return 差值
 */
- (NSDateComponents *)zyn_deltaFromDateString:(NSString *)dateString
                           withDateFormat:(NSString *)dateFormat {
    //日期格式化类
    NSDateFormatter *zyn_dateFormat = [[NSDateFormatter alloc] init];

    //设置日期格式, 这里提取参数, 可以根据需求传入
    zyn_dateFormat.dateFormat = dateFormat;
    
    //创建时间
    NSDate *create = [zyn_dateFormat dateFromString:dateString];
    
    //日历
    NSCalendar *zyn_calendar = [NSCalendar currentCalendar];
    
    //比较时间
    NSCalendarUnit zyn_unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    return [zyn_calendar components:zyn_unit fromDate:create toDate:self options:0];
}

时间判断

在求出时间差值以后, 需要自己对时间进行判断, 做条件的话, 封装BOOL方法比较适合, 需要做时间判断的个人认为只需要做今年以内的时间判断就好了, 之前的时间, 去年, 前年, 大前年, 这种完全没必要.

同样是在date类目中

今年?

- (BOOL)isCurrentYear {
    
    //现在时间
    NSDate *current = [NSDate date];
    
    //日历
    NSCalendar *calender = [NSCalendar currentCalendar];
    
    NSInteger currentYear = [calender component:NSCalendarUnitYear fromDate:current];
    NSInteger selfYear = [calender component:NSCalendarUnitYear fromDate:self];
    
    return currentYear == selfYear;
}

今天?

- (BOOL)isToday {
    
    NSDate *current = [NSDate date];
    
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    
    NSString *nowStr = [fmt stringFromDate:current];
    NSString *selfStr = [fmt stringFromDate:self];
    
    return [nowStr isEqualToString:selfStr];
}

昨天?

- (BOOL)isYesterday {
    
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    
    NSDate *currentDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
    NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:currentDate options:0];
    
    return cmps.year == 0 && cmps.month == 0 && cmps.day == 1;
}

OK, 时间类目封装完毕, 需要在cell的label上显示时间了.
同样判断时间需要很长的代码, 写在cell上过于冗长, 影响美观, 既然label.text是字符串, 那么我们就在string+category中完成这些判断即可.


string+category封装

直接上代码了, 逻辑就不细说了, 反正先从大时间开始判断就行了

#import "NSString+ZYNExtension.h"

@implementation NSString (ZYNExtension)

- (NSString *)zyn_timeWithString:(NSString *)timeStr
           andOriginalDateFormat:(NSString *)dateFormat
              andYesterdayFormat:(NSString *)yFormat
                   andYearFormat:(NSString *)yearFormat {
    
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)
    fmt.dateFormat = dateFormat;
    // 帖子的创建时间
    NSDate *create = [fmt dateFromString:timeStr];
    
    if (create.isCurrentYear) {
        if (create.isToday) {
            
            //取出时间组成
            NSDateComponents *cmps = [[NSDate date] zyn_deltaFromDateString:timeStr withDateFormat:dateFormat];
            
            if (cmps.hour >= 1) {
                
                return [NSString stringWithFormat:@"%zd小时前", cmps.hour];
                
                //大于一分钟还是大于半分钟还是大于几秒钟, 这个根据自己喜好再加判断就行
            } else if (cmps.minute >= 1) { 
                
                return [NSString stringWithFormat:@"%zd分钟前", cmps.minute];
                
            } else {
                
                return @"刚刚";
            }
            
        } else if (create.isYesterday) {
            //传入昨天需要的时间格式
            fmt.dateFormat = yFormat;
            return [fmt stringFromDate:create];
            
        } else {
            
            //传入今年其他时间需要的格式
            fmt.dateFormat = yearFormat;
            return [fmt stringFromDate:create];
        }
        
    } else {
        return timeStr;
    }
}
@end

String类目封装完事, 接下来就是在cell上显示了, model和cell中代码会非常简单


model和cell中的代码

在pch文件中引入上面的头文件

model中代码

#import "ZYNHomeModel.h"

static NSString *const dateFormat = @"yyyy-MM-dd HH:mm:ss";

@implementation ZYNHomeModel

//重写网络获取的时间字符串get方法
- (NSString *)createTime {
    
    return [[NSString string] zyn_timeWithString:_createTime
                           andOriginalDateFormat:dateFormat
                              andYesterdayFormat:@"昨天 HH:mm"
                                   andYearFormat:@"MM-dd HH:mm"];
}

@end

cell中代码

在setModel方法中:
self.timeLabel.text = self.homeModel.createTime;
即可, 不用出现任何逻辑判断


效果

昨天
前天
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,620评论 4 59
  • github排名https://github.com/trending,github搜索:https://gith...
    小米君的demo阅读 4,186评论 2 38
  • 本文参与#漫步青春#征文比赛,作者张甜甜本人承诺内容为原创且未在其他平台发布 青春路上,驻足稍歇 儿时的我们,都...
    变矮的小高个阅读 332评论 0 1
  • 2015年,大年三十,晚。 今年没有以往该有的喜悦,亲朋好友兄弟姐妹们的面容多了几分憔悴,几分悲伤——“外公不在了...
    CallMe丶疯子阅读 136评论 0 0