博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS常用于显示几小时前/几天前/几月前/几年前的代码片段
阅读量:6199 次
发布时间:2019-06-21

本文共 2460 字,大约阅读时间需要 8 分钟。

/** * 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作为标准,因此,

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

转载地址:http://zfica.baihongyu.com/

你可能感兴趣的文章
day5 笔记
查看>>
安装最新Nginx
查看>>
周末大放送网站图片上传,水印,预览,截图
查看>>
【BZOJ 2654】tree
查看>>
Webpack 2 设置为从当前文件夹逐级向上查找模块
查看>>
【转载】MySQL常用系统表大全
查看>>
Stay Hungry, Stay Foolish--2005斯坦福大学05年毕业演讲
查看>>
浙江电信张涛:天翼阅读未来将收费 资费采用包月形
查看>>
[转载] 百科全说——漆浩:观手分辨五行人教您五行人的养生绝招(11-01-10&11-01-11)...
查看>>
How to use the Custom Material node and create Metaballs 官方视频学习笔记
查看>>
各种HTTP状态的含义
查看>>
51nod 1238 最小公倍数之和 V3
查看>>
CSS与JQuery的相关问题
查看>>
hashmap hashtable 的区别
查看>>
文件方式实现完整的英文词频统计实例
查看>>
修改屏幕亮度
查看>>
day 10 7
查看>>
IE下javascript cookie path设置Bug
查看>>
若有所思
查看>>
我为什么选择博客园
查看>>