美文网首页疯-iOS杂iOS学习笔记移动开发
创建类似新浪微博发表时间显示的转换的类方法

创建类似新浪微博发表时间显示的转换的类方法

作者: iiKris | 来源:发表于2016-08-06 23:52 被阅读246次

新浪微博的微博内容显示的发表时间如示例图1所示,从服务器获取到的微博发表时间数据其实是如示例图2所示,这时就需要对获取到的发表时间数据进行重写get方法。在进行重写get方法时涉及到对时间数据的转换,转换方法较为典型,因此可以将转换方法封装为继承NSDate的一个转换类方法,方便以后使用。

示例图1 示例图2

具体的创建过程详见文章《利用Category创建类的方法,快速修改frame,提高编程效率

(1)NSDate+SHKExtension.h

#import<Foundation/Foundation.h>

@interface NSDate (SHKExtension)

//判断某个时间是否为今年

- (BOOL)isThisYear;

//判断某个时间是否为昨天

- (BOOL)isYesterday;

//判断某个时间是否为今天

-(BOOL)isToday;

@end


(2)NSDate+SHKExtension.m

#import "NSDate+SHKExtension.h"

@implementation NSDate (SHKExtension)

-(BOOL)isThisYear{

    NSCalendar *calendar=[NSCalendar currentCalendar];

    //获得某个时间的年月日时分秒

    NSDateComponents *dateCmps=[calendar components:NSCalendarUnitYear fromDate:self];

    NSDateComponents *nowCmps=[calendar components:NSCalendarUnitYear fromDate:[NSDate date]];

    return dateCmps.year==nowCmps.year;

}

//判断某个时间是否为昨天

-(BOOL)isYesterday{

    NSDate *now=[NSDate date];

    // date ==  2014-04-30 10:05:28 --> 2014-04-30 00:00:00

    // now == 2014-05-01 09:22:10 --> 2014-05-01 00:00:00

    NSDateFormatter *fmt=[[NSDateFormatter alloc]init];

    fmt.dateFormat=@"yyyy-MM-dd";

    // 2014-04-30

    NSString *dateStr=[fmt stringFromDate:self];

    // 2014-10-18

    NSString *nowStr=[fmt stringFromDate:now];

    // 2014-10-30 00:00:00

    NSDate *date=[fmt dateFromString:dateStr];

    // 2014-10-18 00:00:00

    now=[fmt dateFromString:nowStr];

    NSCalendar *calendar=[NSCalendar currentCalendar];

    NSCalendarUnit unit=NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;

    NSDateComponents *cmps=[calendar components:unit fromDate:date toDate:now options:0];

    return cmps.year==0&&cmps.month==0&&cmps.day==1;

}

-(BOOL)isToday{

    NSDate *now=[NSDate date];

    NSDateFormatter *fmt=[[NSDateFormatter alloc]init];

    fmt.dateFormat=@"yyyy-MM-dd";

    NSString *dateStr=[fmt stringFromDate:self];

    NSString *nowStr=[fmt stringFromDate:now];

    return [dateStr isEqualToString:nowStr];

}

@end

(3)类方法的使用示例

//重写get方法

-(NSString *)created_at{

    //日期格式化类

    NSDateFormatter *fmt=[[NSDateFormatter alloc]init];

    // 如果是真机调试,转换欧美时间,需要设置locale

    fmt.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];

    fmt.dateFormat=@"EEE MMM dd HH:mm:ss Z yyyy";

    //微博的创建日期

    NSDate *createDate=[fmt dateFromString:_created_at];

    //当前时间

    NSDate *now=[NSDate date];

    //日历对象(比较日期之间的差距)

    NSCalendar *calendar=[NSCalendar currentCalendar];

    // NSCalendarUnit枚举代表想获得哪些差值

    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

    //计算两个日期之间的差值

    NSDateComponents *cmps=[calendar components:unit fromDate:createDate     toDate:now options:0];

    if ([createDate isThisYear]) {//今年

        if ([createDate isYesterday]) {//昨天

        fmt.dateFormat=@"昨天 HH:mm";

        return [fmt stringFromDate:createDate];

        }else if([createDate isToday]){//今天

            if (cmps.hour>=1) {

                return [NSString stringWithFormat:@"%d小时前",cmps.hour];

            }else if (cmps.minute>=1){

                return [NSString stringWithFormat:@"%d分钟前",cmps.minute];

            }else{

                return @"刚刚";

            }

        }else{//今年的其他日子

            fmt.dateFormat=@"MM-dd HH:mm";

            return [fmt stringFromDate:createDate];

        }

    }else{//非今年

        fmt.dateFormat=@"yyyy-MM-dd HH:mm";

        return [fmt stringFromDate:createDate];

    }

}

小结

以上方法是针对近期自学新浪微博项目的一点小小总结,行笔简陋,如有错误,望指正。

"彩蛋":循环着这首《Prayer In C》写完的这篇文章,这首本来是很普通和典型的独立音乐曲调的歌,之后被一位德国DJ Robin Schulz重新制作后引起了轰动,曾获多国榜单冠军单曲。


Prayer In C - 腾讯视频


相关文章

网友评论

  • 程序猿界的cai渣渣:NSCalendarUnit *unit=NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 这个地方应该改为NSCalendarUnit unit =[];没有星号
    iiKris:@戎马一书生 谢谢指正,最近开学忙于做新项目,一直都没时间上简书 :stuck_out_tongue_winking_eye:

本文标题:创建类似新浪微博发表时间显示的转换的类方法

本文链接:https://www.haomeiwen.com/subject/djxlsttx.html