Как использовать параметр isLenient NSDateFormatter?

Кажется, я не могу найти никакой информации об этом флаге, в StackOverflow или где-либо еще в Интернете. В собственной документации Apple говорится только:

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

Может быть, я неправильно понимаю, как это должно работать, но я вообще не могу заставить его работать. Мое предположение было примерно таким (с относительно простой датой для анализа):

> import Foundation
> let df = DateFormatter()
> df.isLenient = true
> df.date(from: "12:00 1/1/2001")
$R0: Date? = nil

Что бы я ни пытался, я получаю ноль.

Я также вижу флаг doesRelativeDateFormatting, который утверждает, что поддерживает такие фразы, как «сегодня» и «завтра»», но, похоже, он тоже ничего не делает:

> df.doesRelativeDateFormatting = true
> df.date(from: "today")
$R1: Date? = nil

Любые идеи?


person J. Cocoe    schedule 27.09.2016    source источник
comment
Вероятно, вы ищете NSDataDetector stackoverflow.com/questions/32595651/   -  person Leo Dabus    schedule 27.09.2016
comment
Лео: Хороший звонок. Я хочу заменить allowsNaturalLanguage, а lenient находится рядом с ним в разделе поддержки естественного языка.   -  person J. Cocoe    schedule 27.09.2016


Ответы (1)


Вот пример, когда снисходительный вариант имеет значение:

let df = DateFormatter()
df.timeZone = TimeZone(secondsFromGMT: 0)
df.isLenient = true
df.dateFormat = "yyyy-MM-dd"
print(df.date(from: "2015-02-29")) // Optional(2015-03-01 00:00:00 +0000)

2015 год не високосный, поэтому 29 февраля нет. С isLenient = true дата интерпретируется как 1 марта. С isLenient = false отбрасывается:

let df = DateFormatter()
df.timeZone = TimeZone(secondsFromGMT: 0)
df.isLenient = false
df.dateFormat = "yyyy-MM-dd"
print(df.date(from: "2015-02-29")) // nil
person Martin R    schedule 27.09.2016
comment
Интересно. Однако я немного смущен: какое это имеет отношение к поддержке естественного языка? Или это просто ляп документации? - person J. Cocoe; 27.09.2016
comment
@J.Cocoe: я не знаю. Примеры показывают, как можно использовать isLenient, но не отвечают на вопрос о замене allowNaturalLanguage. - person Martin R; 27.09.2016
comment
@J.Cocoe: Если ваша настоящая проблема заключается в том, как заменить allowNaturalLanguage, вам следует соответствующим образом обновить вопрос (и заголовок) (а не скрывать эту информацию в комментариях). В настоящее время вы просто спрашиваете об isLenient, так что это может быть XY-проблема. - person Martin R; 28.09.2016
comment
Моя настоящая проблема примерно на 17 яков выше этой и совершенно не подходит для вопроса StackOverflow. Я подумал, что может кто-нибудь описать эту в основном недокументированную функцию (которая выглядит так, как будто она должна делать именно то, что я хочу, но я не могу заставить ее работать), был хорошим вопросом. До сих пор, на самом деле. Независимо от моей реальной проблемы, мне очень любопытно узнать, что на самом деле делает этот флаг. Это просто для обработки любого номера дня до 49 путем переноса его на следующий месяц? - person J. Cocoe; 29.09.2016
comment
@ J.Cocoe Удачи в выяснении этого? Я пытаюсь понять ту же переменную в классе NumberFormatter. - person Brandon Bradley; 18.07.2017