Удобные описания даты с NSDate на iOS
Я хочу показать NSDates в "удобном для человека образом", например, "на прошлой неделе" или "несколько дней назад". Что-то похожее на Pretty Time для Java.
Какой лучший способ сделать это, подклассификация NSDateFormatter? Прежде чем я пойду и заново изобретаю колесо, есть ли для этого какая-то библиотека?
Ответы
Ответ 1
Это решение в 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)
}
Ответ 2
На iOS 4 и более поздних версиях используйте свойство doesRelativeDateFormatting:
NSDateFormatter *dateFormatter = ...;
dateFormatter.doesRelativeDateFormatting = YES;
Ответ 3
Три20 NSDateAdditions:
https://github.com/pbo/three20/blob/master/src/Three20Core/Sources/NSDateAdditions.m
.. позволяет это сделать.
EDIT: В 2013 году вы действительно не хотите больше использовать Three20. Используйте решение Regexident.
Ответ 4
Полный фрагмент кода для человекочитаемых дат в Xcode:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLocale *locale = [NSLocale currentLocale];
[dateFormatter setLocale:locale];
[dateFormatter setDoesRelativeDateFormatting:YES];
Ответ 5
Хороший формат даты YLMoment, который основан на популярном moment.js.
Отформатирует хорошие относительные времена.
Ответ 6
Используйте 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
.