在微博、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 建一个分类
/**
* 比较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;
}
}