iOS常用于显示几小时前/几天前/几月前/几年前的代码片段

简介:
/**
 * Retain a formated string with a real date string
 *
 * @param dateString a real date string, which can be converted to a NSDate object
 *
 * @return a string that will be x分钟前/x小时前/昨天/x天前/x个月前/x年前
 */
+ (NSString *)timeInfoWithDateString:(NSString *)dateString {
  // 把日期字符串格式化为日期对象
  NSDate *date = [NSDate dateFromString:dateString withFormat:@"yyyy-MM-dd HH:mm:ss"];
  
  NSDate *curDate = [NSDate date];
  NSTimeInterval time = -[date timeIntervalSinceDate:curDate];
  
  int month = (int)([curDate getMonth] - [date getMonth]);
  int year = (int)([curDate getYear] - [date getYear]);
  int day = (int)([curDate getDay] - [date getDay]);
  
  NSTimeInterval retTime = 1.0;
  // 小于一小时
  if (time < 3600) {
    retTime = time / 60;
    retTime = retTime <= 0.0 ? 1.0 : retTime;
    return [NSString stringWithFormat:@"%.0f分钟前", retTime];
  }
  // 小于一天,也就是今天
  else if (time < 3600 * 24) {
    retTime = time / 3600;
    retTime = retTime <= 0.0 ? 1.0 : retTime;
    return [NSString stringWithFormat:@"%.0f小时前", retTime];
  }
  // 昨天
  else if (time < 3600 * 24 * 2) {
    return @"昨天";
  }
  // 第一个条件是同年,且相隔时间在一个月内
  // 第二个条件是隔年,对于隔年,只能是去年12月与今年1月这种情况
  else if ((abs(year) == 0 && abs(month) <= 1)
           || (abs(year) == 1 && [curDate getMonth] == 1 && [date getMonth] == 12)) {
    int retDay = 0;
    // 同年
    if (year == 0) {
      // 同月
      if (month == 0) {
        retDay = day;
      }
    }
    
    if (retDay <= 0) {
      // 这里按月最大值来计算
      // 获取发布日期中,该月总共有多少天
      int totalDays = [NSDate daysInMonth:(int)[date getMonth] year:(int)[date getYear]];
      // 当前天数 + (发布日期月中的总天数-发布日期月中发布日,即等于距离今天的天数)
      retDay = (int)[curDate getDay] + (totalDays - (int)[date getDay]);
      
      if (retDay >= totalDays) {
        return [NSString stringWithFormat:@"%d个月前", (abs)(MAX(retDay / 31, 1))];
      }
    }
    
    return [NSString stringWithFormat:@"%d天前", (abs)(retDay)];
  } else  {
    if (abs(year) <= 1) {
      if (year == 0) { // 同年
        return [NSString stringWithFormat:@"%d个月前", abs(month)];
      }
      
      // 相差一年
      int month = (int)[curDate getMonth];
      int preMonth = (int)[date getMonth];
      
      // 隔年,但同月,就作为满一年来计算
      if (month == 12 && preMonth == 12) {
        return @"1年前";
      }
      
      // 也不看,但非同月
      return [NSString stringWithFormat:@"%d个月前", (abs)(12 - preMonth + month)];
    }
    
    return [NSString stringWithFormat:@"%d年前", abs(year)];
  }
  
  return @"1小时前";
}

这里计算多少个月前时,为了减少计算量,没有分别获取对应月份的总天数,而是使用月份最大值31作为标准,因此,

如果需要更精准的计算,把对应的一小段代码替换掉即可

目录
相关文章
|
iOS开发 开发者
iOS开发 - placeholder默认灰色在同系统同型号手机上显示不一致(灰和黑)
iOS开发 - placeholder默认灰色在同系统同型号手机上显示不一致(灰和黑)
200 0
iOS开发 - placeholder默认灰色在同系统同型号手机上显示不一致(灰和黑)
iOS--设置系统导航栏右上角按钮不显示问题
iOS--设置系统导航栏右上角按钮不显示问题
248 0
|
iOS开发
iOS开发 - 同一段文字显示不同颜色和字体
iOS开发 - 同一段文字显示不同颜色和字体
112 0
|
iOS开发
iOS开发-同一段文字显示不同颜色
iOS开发-同一段文字显示不同颜色
103 0
|
iOS开发
IOS显示GIF图片
IOS显示GIF图片
85 0
|
iOS开发
iOS 状态栏的隐藏显示与状态栏样式的设置
iOS 状态栏的隐藏显示与状态栏样式的设置
1107 0
iOS 状态栏的隐藏显示与状态栏样式的设置
|
Swift iOS开发
iOS - Swift - NSAttributedString 显示Emoji乱码问题
iOS - Swift - NSAttributedString 显示Emoji乱码问题
iOS - Swift - NSAttributedString 显示Emoji乱码问题
|
iOS开发
iOS小技能:自定义tab滑块( segment功能+label混合显示)
iOS小技能:自定义tab滑块( segment功能+label混合显示)
366 0
iOS小技能:自定义tab滑块( segment功能+label混合显示)
|
算法 iOS开发
iOS视图滚动的时候控制导航条标题及公告视图的alpha(显示与隐藏)
iOS视图滚动的时候控制导航条标题及公告视图的alpha(显示与隐藏)
245 0
iOS视图滚动的时候控制导航条标题及公告视图的alpha(显示与隐藏)