在iOS上使用NSDate进行人性化的日期描述

时间:2011-06-13 15:09:17

标签: cocoa-touch cocoa nsdate nsdateformatter

我希望以“人性化的方式”显示NSDates,例如“上周”或“几天前”。与Pretty Time for Java类似的东西。

最好的方法是什么,继承NSDateFormatter?在我重新发明轮子之前,是否已经有了一些库?

6 个答案:

答案 0 :(得分:40)

在iOS 4及更高版本中,使用doesRelativeDateFormatting属性:

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

答案 1 :(得分:7)

Three20的NSDateAdditions:

https://github.com/pbo/three20/blob/master/src/Three20Core/Sources/NSDateAdditions.m

..也允许你这样做。

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

答案 2 :(得分:5)

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

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

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

    [dateFormatter setDoesRelativeDateFormatting:YES];

答案 3 :(得分:4)

这是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)
  }

答案 4 :(得分:1)

一个好日期格式化程序是YLMoment,它基于流行的moment.js

确实形成了相对较好的相对时间。

答案 5 :(得分:0)

使用DateTools(github / Cocoapods)timeAgoSinceNow功能。这是一些示例输出...

NSDate.init(timeIntervalSinceNow:-3600).timeAgoSinceNow() "An hour ago" NSDate.init(timeIntervalSinceNow:-3600*24).timeAgoSinceNow() "Yesterday" NSDate.init(timeIntervalSinceNow:-3600*24*6).timeAgoSinceNow() "6 days ago" NSDate.init(timeIntervalSinceNow:-3600*24*7*3).timeAgoSinceNow() "3 weeks ago" NSDate.init(timeIntervalSinceNow:-3600*24*31*3).timeAgoSinceNow() "3 months ago"

timeAgoSinceDate功能也很方便。

DateTools支持许多(人类)语言,并提供比NSDateFormatter有限doesRelativeDateFormatting更好的相对描述。