NSDate时间显示样式

有时候需要对发表的说说或者日志的日期进行如下格式的显示:

* 发表时间和当前时间对比,显示发表时间为:
/**
 今年
    今天
        1分钟内
            刚刚
        1小时内
            xx分钟前
    其他
        xx小时前
    昨天
        昨天 18:56:34
    其他
        06-23 19:56:23

 非今年
    2014-05-08 18:45:30
 */

给NSDate添加一个分类

分类方法如下:

@implementation NSDate (HLExtension)

/**
 *  比较两个日期之间的差值
 */
- (NSDateComponents *)deltaFromDate:(NSDate *)fromDate
{
    // 日历
    NSCalendar *calender = [NSCalendar currentCalendar];

    // 比较时间
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    // 返回日期的差值
    return [calender components:unit fromDate:fromDate toDate:self options:0];
}

/**
 *  判断是否为今年
 */
- (BOOL)isThisYear
{
    // 日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
    NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
    return nowYear == selfYear;
}

/**
 *  判断是否为今天
 */
- (BOOL)isToday
{
    // 2015-07-28 18:30:00 -> 2015-07-28
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";

    // 日期转化为字符串
    NSString *nowString = [fmt stringFromDate:[NSDate date]];
    NSString *selfString = [fmt stringFromDate:self];
    return [nowString isEqualToString:selfString];
}
/**
 *  判断是否为昨天
 */
-(BOOL)isYesterDay
{
    // 2015-07-28 18:30:00 -> 2015-07-28
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";

    // 转换日期
    NSDate *nowDate = [fmt dateFromString:[fmt stringFromDate:[NSDate date]]];
    NSDate *selfDate = [fmt dateFromString:[fmt stringFromDate:self]];

    // 日历(比较时间)
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *cmps = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];

    return cmps.year == 0 && cmps.month == 0 && cmps.day == 1;
}
@end

在使用的时候进行相应的判断,就可以返回期望的时间格式

/**
 *  重写create_time的get方法
 */
- (NSString *)create_time
{
    // 日期格式化类
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 帖子创建时间
    NSDate *createDate = [fmt dateFromString:_create_time];

    if (createDate.isThisYear) { // 今年
        if (createDate.isToday) { // 今天
            NSDateComponents *cmps = [[NSDate date] deltaFromDate:createDate];
            if (cmps.hour >= 1) { // 1个小时 > 时间差
                return [NSString stringWithFormat:@"%zd小时前", cmps.hour];
            } else if (cmps.minute >= 1) { // 1个小时 > 时间差 > 1分钟
                return [NSString stringWithFormat:@"%zd分钟前", cmps.minute];
            } else { // 1分钟 > 时间差
                return @"刚刚";
            }
        } else if (createDate.isYesterDay) {
            fmt.dateFormat = @"昨天 HH:mm:ss";
            return [fmt stringFromDate:createDate];
        } else { // 其他
            fmt.dateFormat = @"MM-dd HH:mm:ss";
            return [fmt stringFromDate:createDate];
        }
    } else { // 非今年
        return _create_time;
    }
}

你可能感兴趣的:(NSDate时间显示样式)