NSDateFormatter возвращает нулевые значения dateFromString: iPhone?

Работаю в приложении для iPhone. Получаю дату из ответа веб-сервиса. Когда я получаю дату, которую я сохраняю в NSArray. И когда я меняю NSString на NSDate, дата возвращает null. Вот мой код,

  for (int k = 0; k<[dateArray count]; k++)  
 {
    NSString *dateStr = [dateArray objectAtIndex:k];
    NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
    [dateFormatter1 setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
    [dateFormatter1 setFormatterBehavior:NSDateFormatterBehaviorDefault];
    [dateFormatter1 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    NSLog(@"DateStr : %@", dateStr); //Console Output is : 2012-07-09 13:50:07 [For 42nd and above values]
    NSDate *date = [dateFormatter1 dateFromString:dateStr];
    NSLog(@"Date : %@", date); // Console Output is : (null) [For 42nd and above values]
 }

DateArray содержит 43 значения даты из Webservice. NSDateFormatter returns correct NSDate from NSString til 41nd values. Когда 42nd string passing to the NSDateFormatter the output returns "(null)". я пробовал, когда дата снова возвращает значение null, я снова конвертировал dateFromString, возникает ошибка "(null)". Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо.


person Gopinath    schedule 10.07.2012    source источник
comment
Что за строка в 42-м значении? Вы проверили, что это действительная дата и в правильном формате?   -  person Nick Bull    schedule 10.07.2012
comment
@NickBull Спасибо. Это строка из массива 2012-07-09 13:50:07. Я взял это значение и преобразовал его в NSDate, используя тот же NSDateFormatter в другом месте класса. Он возвращает точное значение NSDate. Это действительно. Не могли бы вы помочь мне решить эту проблему? Спасибо.   -  person Gopinath    schedule 10.07.2012
comment
Добавьте NSLog(@"DateStr : %@", dateStr); в строку перед NSDate *date = [dateFormatter1 dateFromString:dateStr];, а затем отредактируйте свой вопрос с помощью вывода консоли.   -  person Nick Bull    schedule 10.07.2012
comment
@NickBull Спасибо. Я отредактировал свой вопрос. Пожалуйста, просмотрите его. Спасибо.   -  person Gopinath    schedule 10.07.2012
comment
Попробуйте использовать getObjectValue:forString:range:error: в NSDateFormatter, а затем изучите причину ошибки.   -  person Nick Bull    schedule 10.07.2012
comment
Дай угадаю: 42-е значение — это первое, у которого значение часа больше 12.   -  person Hot Licks    schedule 10.07.2012
comment
Просто совет: если вы хотите ускорить процесс, создайте NSDateFormatetr вне цикла и вызовите dateFromString: только внутри внешнего вида.   -  person rckoenes    schedule 10.07.2012


Ответы (3)


Попробуйте использовать заглавную «ЧЧ» вместо «чч». чч - это часы 1-12, ЧЧ - это часы 0-23 - может быть, 13:00 бросает это?

person gamozzii    schedule 10.07.2012
comment
Большое спасибо. Я исправил проблему. Еще раз спасибо. - person Gopinath; 10.07.2012

Попробуйте везде использовать один и тот же NSDateFormatter и повторите цикл forin. Вы теряете тонну памяти так, как используете сейчас. Я не могу гарантировать, что это решит вашу проблему, но, по крайней мере, это очистит ваш код.

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 

for (NSString *dateString in dateArray) {
    NSLog (@"Date %@ and index %i: NSDate representation is %@", dateString, [dateArray indexOfObject:dateString], [dateFormatter dateFromString:dateString]);
}

Если это не решит вашу проблему, имейте в виду несколько вещей:

  1. Не устанавливайте timeZone в форматировщике даты. Строки не содержат часовой пояс, поэтому он ничего не сделает.
  2. Также не устанавливайте formatterBehavior. Это автоматически NSDateFormatterBehaviorDefault.
  3. Убедитесь, что первые 41 свидание и остальные ничем не отличаются.
person aopsfan    schedule 10.07.2012
comment
Спасибо за Ваш ответ. Я исправил проблему из ответа Mr.Gamozzii. Спасибо за ваши усилия. - person Gopinath; 10.07.2012

вы используете формат «гггг-мм-дд чч: мм: сс» вместо «гггг-мм-дд чч: мм: сс»

чч — это часы 1–12, ЧЧ — это часы 0–23. У вас есть часы в формате 0–23.

[dateFormatter1 setDateFormat:@"гггг-ММ-дд ЧЧ:мм:сс"];

person Pooja Jalan    schedule 04.09.2013