2016-09-27 4 views
1

Я не могу найти информацию об этом флаге, в StackOverflow или в другом месте в Интернете. Собственная документация Apple только говорит:Как использовать параметр isLenient NSDateFormatter?

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

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

> 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 

Любые идеи?

+1

То, что вы, вероятно, ищет это NSDataDetector http://stackoverflow.com/questions/32595651/convert-from-date- string-in-unknown-format/32595941 # 32595941 –

+0

Лев: Хороший звонок. Я хочу заменить 'allowNaturalLanguage', а' lenient' находится рядом с ним в разделе «Поддержка естественного языка». –

ответ

2

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

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 
+0

Интересно. Я немного смущен, хотя: что это связано с «поддержкой естественного языка»? Или это просто документирующий пузырь? –

+0

@ J.Cocoe: Не знаю. В примерах показано, как isLenient можно использовать, но не отвечайте на вопрос о замене NaturalNanguage. –

+0

@ J.Cocoe: Если ваша * действительная проблема * заключается в том, как заменить allowNaturalLanguage, тогда вы должны соответствующим образом обновить вопрос (и заголовок) (и не скрывать эту информацию в комментариях). В настоящее время вы просто спрашиваете о «isLenient», так что это может быть связано с XY-проблемой. –