Cocoa touch iOS上带有NSDate的人性化日期描述

Cocoa touch iOS上带有NSDate的人性化日期描述,cocoa-touch,cocoa,nsdate,nsdateformatter,Cocoa Touch,Cocoa,Nsdate,Nsdateformatter,我想以“人性化的方式”显示NSDates,例如“上周”或“几天前”。类似于 子类化NSDateFormatter是最好的方法吗?在我开始重新发明轮子之前,是否已经有一些用于此的库?在iOS 4及更高版本上,请使用以下属性: NSDateFormatter *dateFormatter = ...; dateFormatter.doesRelativeDateFormatting = YES; 三个20的补充: 。。也允许您这样做 编辑:2013年,你真的不想再使用Three20了。使用Reg

我想以“人性化的方式”显示NSDates,例如“上周”或“几天前”。类似于


子类化NSDateFormatter是最好的方法吗?在我开始重新发明轮子之前,是否已经有一些用于此的库?

在iOS 4及更高版本上,请使用以下属性:

NSDateFormatter *dateFormatter = ...;
dateFormatter.doesRelativeDateFormatting = YES;

三个20的补充:

。。也允许您这样做


编辑:2013年,你真的不想再使用Three20了。使用Regexident的解决方案。

Xcode中人类可读日期的完整代码片段:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    NSLocale *locale = [NSLocale currentLocale];
    [dateFormatter setLocale:locale];

    [dateFormatter setDoesRelativeDateFormatting:YES];
一个好的日期格式化程序是,它基于流行的


它确实格式化了很好的相对时间。

这是Swift 2中的解决方案:

func formattedHumanReadable(date: NSDate) -> String {
    let formatter = NSDateFormatter()
    formatter.timeStyle = .NoStyle
    formatter.dateStyle = .ShortStyle
    formatter.doesRelativeDateFormatting = true

    let locale = NSLocale.currentLocale()
    formatter.locale = locale

    return formatter.stringFromDate(date)
  }
使用(github/Cocoapods)
timeagosinconow
功能。下面是一些示例输出

NSDate.init(timeIntervalSinceNow:-3600).timeagosinconnow()“一小时前”
NSDate.init(timeIntervalSinceNow:-3600*24).timeagosinconnow()“昨天”
NSDate.init(TimeIntervalenceNow:-3600*24*6).timeAgoSinceNow()“6天前”
NSDate.init(timeIntervalSinceNow:-3600*24*7*3).timeAgoSinceNow()“3周前”
NSDate.init(timeIntervalSinceNow:-3600*24*31*3).timeagosinconnow()“3个月前”

timeAgoSinceDate
功能也很方便


DateTools支持多种(人类)语言,并提供了比
NSDateFormatter
更好的相对描述,但它的
doesRelativeDateFormatting

Three20没有本地化。而苹果的
NSDateFormatter
则尊重本地差异(如法语中的“后天”,请参阅)。从长远来看,只学英语通常是个坏主意。@regexident你说得对。当然,因为NSDateAdditions是开源的,所以您可以对它进行本地化,并且可以更好地控制它的行为,而NSDateFormatter可以为您完成这项工作并解决您的问题。然而,不仅仅是这样;我认为他们的行为完全不同,他们的产出也不同。Three20当然更像是facebook。不过,这是一个很好的观察。开源是一个很好的观点(毫无疑问,这是一个优势,也是一种责任)。然而,NSDataFormatter的优点(imho)是始终遵守(并遵循)操作系统标准(可能会发生变化),而无需在将来某一天完全重写。这一点,再加上自定义格式化程序可能造成的混乱。对于“今天/明天/昨天”这样的琐事来说,这不应该是一个大问题,但仍然是一个值得考虑的问题,imho。毕竟,你最不想让你的客户被你的应用搞糊涂了。检查一下这些类似问题的答案:--这太完美了。如果您想要一个时间间隔的自然语言表示,这里有文档::Perfect。iOS上的iTunes wifi同步设置视图显示“最后一次同步:昨天下午1:06”这很好,但它只在日期有效。不是时间(实际上是日期/时间)。i、 e.如果你想要“12分钟前”、“3小时前”、“昨天”,那么你还需要别的东西。@Fogmeister:是的,但OP特别要求“人性化的约会描述”。)@是的,我也在找《泰晤士报》:)呵呵:)只是想澄清一下,因为这是最好的答案。在此之后,我们需要执行类似于[dateFormatter stringFromDate:mydate]的操作;Swift 4:“func formattedHumanReadable()->字符串{let formatter=DateFormatter()formatter.timeStyle=.none formatter.dateStyle=.short formatter.doesRelativeDateFormatting=true formatter.locale=NSLocale.current return formatter.String(from:self)}”