2012-05-16 3 views
3
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [timeFormatter setDateFormat:@"h:mm a"]; 
    NSString *fullTime = [timeFormatter stringFromDate:someDateHere]; 
    NSArray *timeParts = [fullTime componentsSeparatedByString:@" "]; 
    timeLabel.text = [timeParts objectAtIndex:0]; 
    ampmLabel.text = [timeParts objectAtIndex:1]; 

В последней строке падает сОшибка NSDateFormatter. Как так?

NSRangeException*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0] 

Как это возможно? В дату, возвращающуюся непосредственно перед этим кодом, проверяется нуль.

+0

Является ли 'startTime' nil? –

+0

Это даже компилируется? Проверьте скобки на первой строке. – dasblinkenlight

+0

Сделал некоторые изменения, добавив больше контекста. Нет, это не ноль, я проверяю это и вернусь прямо над этими строками. – Blago

ответ

3

Из документации Руководство Форматирование данных (раздел Дата Форматтеры> Использование формата строк для задания пользовательских форматов> Разрешенные форматы):

Хотя в принципе строка формата определяет фиксированный формат, по умолчанию NSDateFormater все еще принимает предпочтения пользователя (включая настройку локали). ... В iOS пользователь может переопределить настройку AM/PM по умолчанию по умолчанию в течение 24 часов. Это может привести к тому, что NSDateFormatter перепишет указанную строку формата.

Другими словами, на устройстве iOS, настроенном на 24-часовую настройку времени, вы не получите «6:02 PM», вы получите «18:02», даже если вы указали « h: mm a ". Поэтому, когда вы разделяете это по пробелам, вы возвращаете одно значение «18:02», а не два значения.

+0

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW4 - это текущая ссылка на приведенные выше документы (Я не добавлял это в ответ, потому что URL-адреса документации Apple dev не являются постоянными). – abarnert

+0

Я собираюсь дать вам одно большое предварительное объятие. Я считаю, что авария произошла в Европе. – Blago

+0

В любом случае, вы ответили на вопрос. Благодаря! – Blago

1

Там один нюанс в documentation for NSDateFormatter, который говорит:

Обратите внимание, что, хотя установка формата строки (setDateFormat:) в принципе определяет точный формат, на практике это может тем не менее быть также переопределены пользователем в настройках, см Data Formatting Guide для более подробной информации.

Может ли это применяться в вашем случае для создания строки без каких-либо пробелов в ней? (Это приведет к массиву длиной 1 при разбиении по пробелам, указав исключение, которое вы видите в том месте, где вы его видите.) Проверьте это, зарегистрировав форматированную дату или добавив отладчик.

Обратите внимание, что конец the page on date formats действительно рекомендует использовать простой старый strftime_l при работе с нелокализованными датами/временем. Это может быть более подходящим для вас. (Кроме того, вам нужен индикатор AM/PM в данных, привязанных к компьютеру? Серьезно? 24-часовое время проще работать с обычно ...)