Удобное описание дат с помощью NSDate на iOS - PullRequest
13 голосов
/ 13 июня 2011

Я хочу отображать NSDates «удобным для человека способом», таким как «на прошлой неделе» или «несколько дней назад». Что-то похожее на Pretty Time for Java .

Какой лучший способ сделать это, подкласс NSDateFormatter? Прежде чем я пойду и изобрету велосипед, уже есть какая-нибудь библиотека для этого?

Ответы [ 6 ]

40 голосов
/ 13 июня 2011

В iOS 4 и более поздних версиях используйте свойство doesRelativeDateFormatting :

NSDateFormatter *dateFormatter = ...;
dateFormatter.doesRelativeDateFormatting = YES;
7 голосов
/ 13 июня 2011

NSDateAdditions Three20:

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

.. позволяет вам сделать это также.

РЕДАКТИРОВАТЬ: В 2013 году вы действительно больше не хочу использовать Three20.Используйте решение Regexident.

5 голосов
/ 16 ноября 2013

Фрагмент полного кода для удобочитаемых дат в Xcode:

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

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

    [dateFormatter setDoesRelativeDateFormatting:YES];
4 голосов
/ 25 февраля 2016

Это решение в 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)
  }
1 голос
/ 05 октября 2015

Хороший форматер даты - YLMoment , основанный на популярном moment.js .

. Форматирует хорошие относительные времена.

0 голосов
/ 02 июня 2016

Используйте функцию 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.

...