如何将 NSDate 转换为相对格式,如“今天”、“昨天”、“一周前”、“一个月前”、“一年前”?

2024-01-08

我想将 nsdate 转换为相对格式,例如"Today","Yesterday","a week ago","a month ago","a year ago","date as it is".

我已经为它编写了以下方法..但是它只是打印日期..你能告诉我应该是什么问题吗?

//以下是我的函数,它将日期转换为相对字符串

+(NSString *)getDateDiffrence:(NSDate *)strDate{
    NSDateFormatter *df = [[NSDateFormatter alloc] init];

    df.timeStyle = NSDateFormatterMediumStyle;
    df.dateStyle = NSDateFormatterShortStyle;
    df.doesRelativeDateFormatting = YES;
    NSLog(@"STRING DATEEE : %@ REAL DATE TODAY %@",[df stringFromDate:strDate],[NSDate date]);
      return [df stringFromDate:strDate];

}

我有以下格式的日期字符串"2013-10-29T09:38:00"

当我尝试提供 NSDate 对象时,它总是返回空日期。
所以我尝试将该日期转换为yyyy-MM-dd HH:mm:ssZZZZ然后我将这个日期传递给函数然后它只是打印整个日期..

如何解决这个问题呢?

//以下是我调用上面函数的代码

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSDate *date = [formatter dateFromString:[threadDict objectForKey:@"lastMessageDate"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZZ"];

NSString *date1 = [formatter stringFromDate:date];
NSDate *date_d = [formatter dateFromString:date1];
NSString *resultstr=[UserManager getDateDiffrence:date];

self.dateLabel.text=resultstr;

为简单起见,我假设您要格式化的日期都是过去的(没有“明天”或“下周”)。并不是说它不能完成,而是需要处理更多的情况并返回更多的字符串。


您可以使用components:fromDate:toDate:options:使用您想要的任何日期组件组合来获取两个日期之间的年数、月数、周数、天数、小时数等。然后按照从最重要(例如年份)到最不重要(例如日期)的顺序遍历它们,您可以仅根据最重要的组成部分来格式化字符串。

例如:1 周、2 天和 7 小时前的日期将被格式化为“1 week”。

如果您想为单位的特殊编号创建特殊字符串,例如“明天”代表“1 天前”,那么您可以在确定该组件是最重要的组件后检查该组件的值。

代码看起来像这样:

- (NSString *)relativeDateStringForDate:(NSDate *)date
{
    NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear | 
                           NSCalendarUnitMonth | NSCalendarUnitYear;

    // if `date` is before "now" (i.e. in the past) then the components will be positive
    NSDateComponents *components = [[NSCalendar currentCalendar] components:units
                                                                   fromDate:date
                                                                     toDate:[NSDate date]
                                                                    options:0];

    if (components.year > 0) {
        return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
    } else if (components.month > 0) {
        return [NSString stringWithFormat:@"%ld months ago", (long)components.month];
    } else if (components.weekOfYear > 0) {
        return [NSString stringWithFormat:@"%ld weeks ago", (long)components.weekOfYear];
    } else if (components.day > 0) {
        if (components.day > 1) {
            return [NSString stringWithFormat:@"%ld days ago", (long)components.day];
        } else {
            return @"Yesterday";
        }
    } else {
        return @"Today";
    }
}

如果您的日期也可能是将来的日期,那么您可以按相同顺序检查组件的绝对值,然后检查它是正数还是负数以返回适当的字符串。我只显示下面的年份:

if ( abs(components.year > 0) ) { 
    // year is most significant component
    if (components.year > 0) {
        // in the past
        return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
    } else {
        // in the future
        return [NSString stringWithFormat:@"In %ld years", (long)components.year];
    }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 NSDate 转换为相对格式,如“今天”、“昨天”、“一周前”、“一个月前”、“一年前”? 的相关文章

随机推荐

  • 如何在我的 Flutter 应用中显示来自 Firebase 的用户数据?

    我是颤振新手 如何将用户数据从 Firebase 检索到我的个人资料页面 我的 Firebase 数据包含姓名 电子邮件 血型和出生日期 我想将此数据检索到我的应用程序的个人资料页面 这是我的个人资料页面代码 import package
  • 为什么不采用依赖类型呢?

    我看到几个消息来源都赞同 Haskell 正在逐渐成为一种依赖类型的语言 的观点 这似乎意味着 随着越来越多的语言扩展 Haskell 正在朝着这个大方向漂移 但还没有实现 基本上有两件事我想知道 第一个很简单 成为一种依赖类型的语言 实际
  • gst 浏览器无法启动

    我刚刚安装了gst browser VisualGST 通过 Canonical Ubuntu 存储库 因此我尝试通过运行来启动 VisualGSTgst browser在命令行上 但是 我立即收到一个错误 a Smalltalk Stre
  • 如何改进 mongodb 的 XML 导入?

    我有一些大型 XML 文件 每个 5GB 我正在将其导入到 mongodb 数据库中 我使用 Expat 来解析文档 进行一些数据操作 删除一些字段 单位转换等 然后插入数据库 我的脚本基于此 https github com bgianf
  • Firebase“符号链接”到另一个节点

    关于我关于建模真实的面向用户的树结构的另一个问题 使用firebase树结构直接表示 文档大纲 结构 https stackoverflow com questions 39112792 using firebase tree struct
  • 检测耳机 Android

    近年来我在 Android 上编程 我想知道一些事情 如何检测耳机的存在 有一个方法 isWiredHeadsetOn 但它不起作用 我已经尝试过 但它不起作用 AudioManager am AudioManager getSystemS
  • 更改环境值后Innosetup SendMessage

    我使用 InnoSetup 在注册表中设置环境变量 Registry Root HKLM Subkey SYSTEM CurrentControlSet Control Session Manager Environment ValueTy
  • 日期格式错误 java.sql.SQLException:无效的列类型

    我正在使用 JSF 显示日期pattern dd MMM yyyy 当我尝试将日期值插入 更新到我的 Oracle DB 时 我得到 java sql SQLException Invalid column type 因为我插入或更新之前的
  • 在 angular2 控制数组中使用单选按钮

    您好 我有一个由控制组组成的控制数组 以及在模板中循环控制数组以创建单选按钮 我可以选择所有单选按钮 即使它们属于不同的控制组并且具有不同的名称 我在这里做了一个 plunker 演示http plnkr co edit jTMZUCj5J
  • 什么是“盒子模型”?

    在最近一次前端开发人员职位面试中 我被问到盒子模型是什么 我以为面试官指的是测试 即白盒测试 黑盒测试 我错了 就前端开发而言 什么是盒子模型 这是一个很棒的CSS盒子模型教程 http www brainjar com css posit
  • django // 1054,“字段列表”中的未知列“rank.post_id_id””

    Django 2 2 3 玛丽亚数据库 从具有 inspectdb 的现有数据库导入模型并更改字段属性后 会发生此错误 class Post models Model post id models AutoField primary key
  • 申请因缺乏 IPv6 支持而被拒绝 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 My last release of application which is 12 8 is rejected by apple saying
  • Apache Geode Web 框架

    我们使用VS并集成了以下Web框架 https visualstudio microsoft com vs features web frameworks https visualstudio microsoft com vs featur
  • 带键值的数组长度,js

    我编写了这段代码 它应该解析给定的 paramUnparsed 它应该是以下形式的数组 key1 val1 key2 val2 keyn valn function parseParams paramUnparsed var params
  • 将 ListView 项目的 id 传递给 ActionMode.Callback 对象

    所以我现在的问题是 现在我长时间单击 ListView 中的一个项目 它会弹出一个上下文操作栏 传递到 onItemLongClick 的 id 是我想在 mActionModeCallback 的 on ActionItemClicked
  • ClearCase 适合我们的开发流程吗?

    那么 让我描述一下我们目前的情况 我们是一个由经验丰富的 Java 开发人员组成的小团队 6 人 迷失在一个主要由 SAP 和 Siebel 配置器组成的大型 IS 团队中 虽然所有其他团队目前都在使用 VSS 主要作为存储系统 但我们的团
  • 确定 R 中加载的对象的名称

    想象你有一个物体foo你另存为saved file rda如下 foo lt a save foo file saved file rda 假设你加载saved file rda进入具有多个对象的环境 但忘记了其中对象的名称saved fi
  • Sqlalchemy 与 postgres。尝试使用“DISTINCT ON”而不是“DISTINCT”

    我需要生成这样的查询 SELECT DISTINCT ON article code article code article title 首先 我尝试通过 ORM 不同的方法来制作它 并向它发送一个包含字段的列表 但这是行不通的 其次 我
  • 在为 ARM7 编译的 C 代码中,使用全局变量会提高还是降低性能?

    当为 ARM7 嵌入式平台进行编译时 在 C 代码中使用大量全局变量是否会降低或提高性能 代码库由多个 C 源代码文件组成 这些文件使用 extern 关键字引用彼此的全局变量 不同源代码文件中的不同函数引用不同的全局变量 有些变量是数组
  • 如何将 NSDate 转换为相对格式,如“今天”、“昨天”、“一周前”、“一个月前”、“一年前”?

    我想将 nsdate 转换为相对格式 例如 Today Yesterday a week ago a month ago a year ago date as it is 我已经为它编写了以下方法 但是它只是打印日期 你能告诉我应该是什么问