При установке doRelativeDateFormatting = YES, stringFromDate возвращает nil

В документации NSDateFormatter,

Если форматирование даты использует относительное форматирование даты, по возможности оно заменяет компонент даты своего вывода фразой, такой как "сегодня" или "завтра", что указывает на относительную дату.

Я использую следующий код:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma"
                                                       options:0
                                                        locale:[NSLocale currentLocale]];
formatter.doesRelativeDateFormatting = YES;
NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]);

Он записывает Date:.

Но при комментировании formatter.doesRelativeDateFormatting = YES; вывод получается корректным.

Date: Tuesday, 19 August 1:18 pm

Я понимаю doesRelativeDateFormatting неправильно?

Ответ 1

Привет, когда я модифицировал такой код. он работает.

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
 formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma"
                                                       options:0
                                                        locale:[NSLocale currentLocale]];
 [formatter setDateStyle:NSDateFormatterFullStyle];
 [formatter setTimeStyle:NSDateFormatterShortStyle];
 formatter.doesRelativeDateFormatting = YES;
  NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]);

Ответ 2

Кажется, что doesRelativeDateFormatting не работает с пользовательским dateFormat.

У меня была такая же проблема, как вы, чтобы отобразить Today, 11:44 pm или 19 Aug, 1:23 am. Жесткая часть заключается в том, что год должен был быть всегда исключен.

Я решил это так:

Получить форматированную дату любого стиля, который вам нравится, с doesRelativeDateFormatting включен

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateFormatter.doesRelativeDateFormatting = true
var dateString = dateFormatter.stringFromDate(dateToFormat)

Получите отформатированный год с той же даты (убедитесь, что dateFormat имеет правильное количество y для представления года. Я использую 4 года, потому что стиль "Средняя дата" использует формат полного года.

let yearFormatter = NSDateFormatter()
yearFormatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("yyyy", options: 0, locale: NSLocale.currentLocale())
let yearString = dateFormatter.stringFromDate(dateToFormat)

Наконец, составьте окончательную строку, удалив год из сгенерированного dateString и обрезая лишнее белую область.

var finalString = dateString.stringByReplacingOccurrencesOfString(yearString, withString: "")
finalString = finalString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

Это не идеальное решение, потому что я уверен, что будет какая-то локаль, где год отформатирован прямо между днем ​​и месяцем или чем-то, что создаст фанк-строку. Но он работает во всех моих проверенных случаях.