一行代码快速搞定发帖时间的显示状态
一行代码快速搞定发帖时间的显示状态
废话不多说,相信玩过微信,微博的人都见过这个功能.
效果图
1.日期是今天范围内的
小于1分钟的
大于1分钟的
大于等于1小时的
昨天的
2.日期是"非今天的"范围内的
业务逻辑
1.拿服务器获取的时间与当前的实时时间作比较
- 首先判断是否是今年
- 如果是今年,接下来判断是否是今天.
- 如果是今天再做详细判断
2.伪代码:
if(今年){
if(今天){
if(大于等于1小时){
显示状态: "几"小时前
}else if(大于等于1分钟){
显示状态: "几"分钟前
}else{
// 小于1分钟
显示状态: 刚刚
}
}else if(昨天){
显示状态: 昨天 HH:mm
}else{
// 昨天之前
显示状态: MM-dd HH:mm:ss
}
}else{
// 非今年
显示状态: yyyy-MM-dd HH:mm:ss
}
如何使用
使用方式非常简单
1.项目中导入 TYDate 工具类文件
2.导入头文件
#import "TYDate.h"
2.找到对应连线的显示时间的Label,通过单例调用下面方法即可
_timeLabel.text = [[TYDate shareInstance] timeStr:item.create_time];
3.方法实现
/**
创建一个单例对象
@return 单例对象
*/
+ (instancetype)shareInstance {
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
/**
服务器时间距当前时间差的直观显示
@param serverTime 服务器获取的时间
@return 一种直观的时间显示方式
*/
- (NSString *)timeStr:(NSString *)serverTime {
NSString *str = nil;
NSDate *createDate = [self serverCreateDate:serverTime];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSDateComponents *deltaTime = [self deltaWithNow:serverTime];
if([self isThisYear:serverTime]) { // 今年
if([self isThisToday:serverTime]){ // 今天
if(deltaTime.hour >= 1) { // 时间差大于等于1小时
str = [NSString stringWithFormat:@"%ld小时前",deltaTime.hour];
}else if (deltaTime.minute >= 1){ // 时间差大于等于1分钟
str = [NSString stringWithFormat:@"%ld分钟前",deltaTime.minute];
}else {
// 小于1分钟
str = @"刚刚";
}
}else if([self isThisYesterday:serverTime]){
dateFormatter.dateFormat = @"昨天 HH:mm";
str = [dateFormatter stringFromDate:createDate];
}else {
// 昨天之前
dateFormatter.dateFormat = @"MM-dd HH:mm:ss";
str = [dateFormatter stringFromDate:createDate];
}
}else { // 非今年
str = serverTime;
}
return str;
}
其它功能实现
-
根据服务器获取的时间
判断是否是今年
- (BOOL)isThisYear:(NSString *)serverTime;
-
根据服务器获取的时间
判断是否是今天
- (BOOL)isThisToday:(NSString *)serverTime;
-
根据服务器获取的时间
判断是否是昨天
- (BOOL)isThisYesterday:(NSString *)serverTime;
-
服务器获取时间与当前的
时间差
- (NSDateComponents *)deltaWithNow:(NSString *)serverTime;
源码地址
点击下载源代码