2016-01-18 2 views
0

Я использую NSDateFormatter для генерации объектов NSDate из строк времени сервера. Мы используем ISO-8601 Extended, и ниже метод я имею, который возвращает дату форматирования, который обрабатывает преобразование:NSDateFormatter возвращает Nil с по-видимому правильной строкой формата

+ (NSDateFormatter *) dateFormatter { 
    NSDateFormatter * dateFormatter = [NSDateFormatter new]; 
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"]; 
    return dateFormatter; 
} 

Однако, когда я использую этот код, ниже утверждают, не удается:

NSDateFormatter * dateFormatter = [MyClass dateFormatter]; 
              // "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
_testDateObject = [dateFormatter dateFromString: @"2016-01-18'T'16:31:16.401Z"]; 
NSParameterAssert(_testDateObject); 

Что случилось с строкой форматирования даты, которую я использую? Я пробовал варианты на нем (например, избегая литералов), и ни один из них не создает действительный NSDate.

EDIT В мое первоначальное сообщение включена некорректная строка форматирования, которую я использовал. Как отметил rmaddy, я должен использовать yyyy-MM-dd'T'HH:mm:ss.SSSZ, которым я являюсь.

+1

Прочитайте документацию для спецификаторы формата даты. Прочитайте, что вы должны использовать в течение года, дня и дробных секунд. – rmaddy

+1

Близко связаны: [Nil NSDate при попытке получить дату из строки UTC в Zulu time] (http://stackoverflow.com/q/1263455) –

+0

Спецификация http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table 'DD' - день года (1.356). «ГГГГ» - не календарный год. 'sss' - секунды. 'SSS' - дробные секунды. – Sulthan

ответ

2

Ваша проблема в том, что ваша строка ввода, "2016-01-18'T'16:31:16.401Z", не соответствует вашему формату.

В строке формата символ ' начинается и заканчивается экранированной последовательностью символов. Подстрока формата 'T' соответствует входной подстроке T, не входная подстрока 'T'. Поскольку ничто в вашей строке формата не соответствует одиночным кавычкам на вашем входе, преобразование не выполняется.

Если вы действительно хотите, чтобы ваш вход, чтобы содержать одиночные кавычки, вы должны использовать двойные одиночные кавычки в вашем формате, чтобы соответствовать их, и использовать одиночные кавычки, спасаясь от T:

let formatter = NSDateFormatter() 
formatter.dateFormat = "yyyy-MM-dd'''T'''HH:mm:ss.SSSZ" 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

let date = formatter.dateFromString("2016-01-18'T'16:31:16.401Z") 

// Result: 
"Jan 18, 2016, 10:31 AM" 
+0

Это работает, когда я пытался предложение! Учитывая, что я не могу изменить формат строки, поступающей с сервера, каково ваше предложение анализировать дату? Я попытался использовать «yyyy-MM-dd''T''HH: mm: ss.SSSZ» (обратите внимание на две одинарные кавычки вокруг T), но это не решило проблему. –

+0

Я обновил свой ответ. –

+0

Спасибо, Роб, что исправил мою проблему! Мне любопытно, почему мне нужна дополнительная пара, чтобы избежать последовательности, а не двух. Это потому, что парсеру нужен дополнительный набор кавычек, чтобы знать, что он должен избегать второй пары кавычек? –

Смежные вопросы