I want to display NSDates in a \"human-friendly way\", such as \"last week\", or \"a few days ago\". Something similar to Pretty Time for Java.
What\'s the best way
This is the solution in 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)
}
On iOS 4 and later, use the doesRelativeDateFormatting property:
NSDateFormatter *dateFormatter = ...;
dateFormatter.doesRelativeDateFormatting = YES;
Use the DateTools (github/Cocoapods) timeAgoSinceNow
function. Here's some sample output...
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"
The timeAgoSinceDate
function is also handy.
DateTools supports many (human) languages and gives much better relative descriptions than NSDateFormatter
's somewhat limited doesRelativeDateFormatting
.
Full code snippet for human readable dates in Xcode:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLocale *locale = [NSLocale currentLocale];
[dateFormatter setLocale:locale];
[dateFormatter setDoesRelativeDateFormatting:YES];
A good date formatter is YLMoment, which is based on the popular moment.js.
It does format nice relative times.
Three20's NSDateAdditions:
https://github.com/pbo/three20/blob/master/src/Three20Core/Sources/NSDateAdditions.m
.. allows you to do that as well.
EDIT: In 2013, you really don't want to use Three20 anymore. Use Regexident's solution.