При установке 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())
Это не идеальное решение, потому что я уверен, что будет какая-то локаль, где год отформатирован прямо между днем и месяцем или чем-то, что создаст фанк-строку. Но он работает во всех моих проверенных случаях.