iOS之 改变日期显示样式

开发社交或者资讯类APP时需要把获取的时间日期改为可读性好的“几小时前”、“几分钟前”

下面我提供方法,可以备下以后套用


首先在工程中添加NSDate的类目”NSDate+GDGCategory

NSDate+GDGCategory.h

#import <Foundation/Foundation.h>

@interface NSDate (GDGCategory)
/**
 *比较from和self的时间差值
 */

-(NSDateComponents*)deltaFrom:(NSDate*)from;

/**
 *是否为今年
 */
-(BOOL)isThisYear;

/**
 *是否为今天
 */
-(BOOL)isToday;

/**
 *是否为昨天
 */
-(BOOL)isYesterday;


@end

NSDate+GDGCategory.m

#import "NSDate+GDGCategory.h"

@implementation NSDate (GDGCategory)

-(NSDateComponents*)deltaFrom:(NSDate*)from
{
    //初始化日历
    NSCalendar * calendar = [NSCalendar currentCalendar];

    //设置日历单元
    NSCalendarUnit unit = NSCalendarUnitDay |NSCalendarUnitMonth |NSCalendarUnitYear |NSCalendarUnitHour |NSCalendarUnitMinute |NSCalendarUnitSecond;
    //返回比较你的数据时间与现在时间的差值
    return [calendar components:unit fromDate:from toDate:self options:0];


}
/*
 *例如  2016 - 05 - 01
 *     年份值  月份  日
 *
 */
//判断是否是今年
-(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
{
    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
{
    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 * calender = [NSCalendar currentCalendar];
    NSDateComponents * cmps = [calender components:NSCalendarUnitDay | NSCalendarUnitMonth |  NSCalendarUnitYear fromDate:selfDate toDate:nowDate options:0];

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

}



@end


备注很清楚,应该可以看懂,代码可以用在很多地方

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
/**你所获取数据的发布时间 */
@property (nonatomic, copy) NSString *create_time;

//get方法
-(NSString *)create_time;

@end

ViewController.m

#import "ViewController.h"
#import "NSDate+GDGCategory.h"
@interface ViewController ()

@end


@implementation ViewController

//重写get方法
-(NSString *)create_time
{
    //日期格式化
    NSDateFormatter * fmt = [[NSDateFormatter alloc]init];
    //设置日期格式
    fmt.dateFormat = @"yyyy-MM-dd HH-mm-ss";
    //帖子的创建时间
    NSDate * create = [fmt dateFromString:_create_time];

    /**
     显示效果
     今年

        今天
         1分钟内
             刚刚
         1小时内
             xx分钟前
         其他
            xx小时前

         昨天
            昨天 18:56:34

         其他
           06-23 19:56:23

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

    if (create.isThisYear) { // 今年
        if (create.isToday) { // 今天
        //时间差
            NSDateComponents *cmps = [[NSDate date] deltaFrom:create];

            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 (create.isYesterday) { // 昨天
            fmt.dateFormat = @"昨天 HH:mm:ss";
            return [fmt stringFromDate:create];
        } else { // 其他
            fmt.dateFormat = @"MM-dd HH:mm:ss";
            return [fmt stringFromDate:create];
        }
    } else { // 非今年
        return _create_time;
    }
}

Demo下载 :GitHub DateShowStyle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值