您的位置:首页 > 其它

NSDate 实现时间格式刚刚、几分钟前、几小时前、昨天、MM-dd HH:mm:ss

2016-02-28 21:06 309 查看
在微博、QQ 或者各种可以发帖的软件中可以发现 发帖时间根据当前时间显示不同的时间格式

( 刚刚、几分钟前、几小时前、昨天、MM-dd HH:mm:ss、 yyyy-MM-dd HH:mm:ss)

第一种方法:

- (void)testDate:(NSString *)create_time

{

//
当前时间

NSDate *now = [NSDatedate];

//
发帖时间

NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

//
设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)

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

NSDate *create = [formatter
dateFromString:create_time];

NSTimeInterval delta = [now
timeIntervalSinceDate:create];

}

把时间转化成固定的时间字符串格式, 然后 [now timeIntervalSinceDate:create]
获取当前时间与某一特定时间的时间差值,转化成多少秒 然后再根据多少秒 得到跟现在的时间对比 显示不同是时间样式

显然这种方式会让不少人恶心的

第二种:

- (void)testDate:(NSString *)create_time

{

//
日期格式化类

NSDateFormatter *fmt = [[NSDateFormatteralloc]init];

//
设置日期格式(y:年,M:月,d:日,H:时,m:分,s:秒)

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

//
当前时间

NSDate *now = [NSDatedate];

//
发帖时间

NSDate *create = [fmt
dateFromString:create_time];

XMGLog(@"%@", [nowdeltaFrom:create]);

//
日历

NSCalendar *calendar = [NSCalendarcurrentCalendar];

//
比较时间

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

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

NSLog(@"%@ %@", create, now);

NSLog(@"%zd %zd %zd %zd %zd %zd", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute,
cmps.second);

//
获得NSDate的每一个元素

NSInteger year = [calendar component:NSCalendarUnitYear fromDate:now];

NSInteger month = [calendarcomponent:NSCalendarUnitMonthfromDate:now];

NSInteger day = [calendarcomponent:NSCalendarUnitDayfromDate:now];

NSDateComponents *cmps = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:now];

XMGLog(@"%zd %zd %zd", cmps.year, cmps.month, cmps.day);

}

在NSDate中有一个日历 可以很方便的解决这个问题

为了以后我们可以重用这个方法 首先我们先为NSDate 建一个分类

/**

* 比较from
和self 的时间差值

*/

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

//
日历

NSCalendar *calender = [NSCalendarcurrentCalendar];

//
比较时间

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

return [calender
components:unit fromDate:from
toDate:self
options:0];

}

/**

* 判断是否是今年

*/

- (BOOL)isThisYear {

//
日历

NSCalendar *calender = [NSCalendarcurrentCalendar];

NSInteger nowYear = [calendercomponent:NSCalendarUnitYearfromDate:[NSDatedate]];

NSInteger selfYear = [calendercomponent:NSCalendarUnitYearfromDate:self];

return nowYear == selfYear;

}

/**

* 判断是否是今天

*/

- (BOOL)isToday {

//
日期格式化类

NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

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

NSString *nowString = [formatter
stringFromDate:[NSDate
date]];

NSString *selfString = [formatter
stringFromDate:self];

// 判断当前日期和传过来的日期是否是同一天

return nowString == selfString;

}

/**

* 判断是否是昨天

*/

- (BOOL)isYesterDay {

// 日期格式化类把当前时间转化成固定的格式

NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

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

/**[formatter stringFromDate:[NSDate date]]把当前的时间格式转化成上面只有年-月-日的时间字符串

* formatter dateFromString:
再把上面的固定时间字符串改成 date
类型

*/

NSDate *nowDate = [formatter
dateFromString:[formatter stringFromDate:[NSDatedate]]];

NSDate *selfDate = [formatter
dateFromString:[formatter stringFromDate:self]];

//
日历

NSCalendar *calender = [NSCalendarcurrentCalendar];

NSDateComponents *components = [calendercomponents:NSCalendarUnitYear |NSCalendarUnitMonth
| NSCalendarUnitDayfromDate:selfDatetoDate:nowDateoptions:0];

//

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

}

然后在Model 中重写发帖时间的get 方法

- (NSString *)create_time {

//
日期格式化类

NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

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

//
帖子的创建时间

NSDate *create = [formatter
dateFromString:_create_time];

if (create.isThisYear) {//今年

if (create.isToday) {//今天

NSDateComponents *compoents = [[NSDatedate]deltaFrom:create];

if (compoents.hour > 1) {

return [NSStringstringWithFormat:@"%ld小时前",compoents.hour];

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

return [NSStringstringWithFormat:@"%ld分钟前",compoents.minute];

} else {

return
@"刚刚";

}

} else if (create.isYesterDay){//昨天

formatter.dateFormat =
@"昨天 HH:mm:ss";

return [formatter
stringFromDate:create];

} else { //其他

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

return [formatter
stringFromDate:create];

}

} else { //
不是今年

return_create_time;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: