/*** 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常用于显示几小时前/几天前/几月前/几年前的代码片段相关推荐

  1. JavaScript获取一周前,一个月前日期

    getDay(day) {var today = new Date();var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * ...

  2. Android 时间间隔显示处理 1小时前 1天前 一个月前

    一.Android中我们常见显示几小时前,几天前,几月前,几年前,下面通过一个类来看看怎么算出该格式: 我们只要把这个类  C+V  一下就能搞定 public class FormatCurrent ...

  3. 仿微信朋友圈时间显示 根据时间获取几分钟前,几小时前,几天前,几月前,几年前

    /*** 显示几天钱几周前几月前几年前* @param d* @return*/ public static String getFriendlytime(Date d){long delta = ( ...

  4. 使用day.js让时间 (显示为几分钟前 几小时前 几天前 几个月前 )

    效果图 代码 utils.ts 通过引入utils.ts import dayjs from 'dayjs'; import 'dayjs/locale/zh-cn'; import relative ...

  5. iOS常用第三方开源框架和优秀开发者博客等

    博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...

  6. iOS常用第三方集合(六)

    代码安全与密码 ios-class-guard- 一个用于混淆iOS的类名.方法名以及变量名的开源库--有人反映编译出来的app运行不了. <Protecting iOS Application ...

  7. iOS - 常用的iOS Mac框架和库以及常用的中文开发博客

    对于iOS以及Mac开发中常用到的一些框架,以及比较好的技术博客做了总结: 主要内容如下: UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关 隐藏与显示 HUD与Toast 对话框 ...

  8. iOS 常用第三方库及插件

    //菜单切换 https://github.com/pujiaxin33/JXCategoryView //各种导航栏样式 https://github.com/rickytan/RTRootNavi ...

  9. iOS常用第三方库大全,史上最全第三方库收集

    下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...

最新文章

  1. 阿里园区生态技术联盟启动大会
  2. 压缩网络模型,或者是融合多个神经网络
  3. ClickHouse之Distributed Query Execution
  4. Python天天美味(13) - struct.unpack
  5. C++ 函数映射使用讲解
  6. java的编译器怎么出来_怎样掌握ava编译器的使用,教程在这里,如何进行Java初级学习...
  7. 市面上有哪几种门_目前市面上木门的几种分类
  8. 常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式
  9. linux shell常用函数,ps
  10. linux安装 wegt_linux 下安装wget
  11. 使用SQLyog远程连接数据库
  12. delphi2007安装说明(备忘)
  13. 一天入门Tableau详细教程(上)
  14. WorkPlus协同办公系统的优势有哪些?
  15. Linux 内核 | 网络流量限速方案大 PK
  16. java画图板之平面山水画(一)
  17. 【MagNet】《Progressive Semantic Segmentation》
  18. java swing 自动补全_扩展easyui的combobox组件的自动完成(autocomplete)
  19. 风控为本 开鑫金服让互联网金融更有安全感
  20. C/C++经典例题:鸡兔同笼

热门文章

  1. iphone 如何实现全屏截图
  2. 6D姿态估计从0单排——看论文的小鸡篇——Learning Analysis-by-Synthesis for 6D Pose Estimation in RGB-D Images...
  3. 使用WeexSDK,网络请求信任证书的问题
  4. 为什么用Object.prototype.toString.call(obj)检测对象类型?
  5. Redis_简单使用
  6. django+celery+rabitmq
  7. xib文件的加载方法
  8. HDU5853 Jong Hyok and String(二分 + 后缀数组)
  9. JS 根据子网掩码,网关计算出所有的IP范围
  10. Combination Sum 和Combination Sum II