NULL возвращается для NSDateFormatter в UILabel

#ios #objective-c #nsdateformatter

#iOS #objective-c #nsdateformatter

Вопрос:

Вот код, о котором идет речь:

 // configure created_at date for display
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
NSLog(@"formattedDate=%@",dateFormatter.dateFormat);
NSLog(@"created_at=%@",notice.created_at);
NSString *createdDateStr = [dateFormatter stringFromDate:notice.created_at];
NSLog(@"createdDateStr=%@",createdDateStr);
self.labelCreated.text=createdDateStr;
  

И вот что получается в NSLog:

 2014-06-29 12:06:48.945 [3589:60b] formattedDate=MMM d, y
2014-06-29 12:06:48.947 [3589:60b] created_at=2013-02-22T08:49:52Z
2014-06-29 12:06:48.948 [3589:60b] createdDateStr=(null)
  

Это выглядит намного сложнее, чем должно быть, но я следил за примерами из библиотеки разработчиков Mac (iOS 7.x, Xcode 5.x) Любые рекомендации будут с благодарностью.

Комментарии:

1. notice.created_at уже является an NSString , а не an NSDate . Конвертировать нечего, если вы не хотите изменить формат строки.

2. На самом деле, это NSDate: @property (readonly) NSDate *created_at;

3. Не в соответствии с выводом журнала.

4. rmaddy — не уверен, на что вы ссылаетесь — в разделе «рассматриваемый код» выше вы увидите строку, NSString *createdDateStr = [dateFormatter stringFromDate:notice.created_at]; — он принимает notice.created_at в качестве параметра NSDate для преобразования stringFromDate . Я не думаю, что проблема именно в этом…

5. Я говорю о 2-м NSLog утверждении. Он регистрирует an NSString , а не an NSDate . Это означает, что вы передаете NSString stringFromDate: методу. Вот почему вы получаете nil результат.

Ответ №1:

Ваш формат даты created_at отличается. Итак, сначала вам нужно соответствующим образом установить dateformat как created_at dateformat, как показано ниже:-

   [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
  

Комментарии:

1. Хуссейн Шаббир — это было сложно понять, но ваше предложение привело меня к правильному решению. У меня есть законный NSDate, но с суффиксом часового пояса. Пришлось создать средство форматирования ввода, передать ему мой NSDate в виде форматированной строки и вернуть «дружественный» NSDate. Затем пришлось создать соответствующий форматировщик вывода и вернуть нужную строку. Теперь работает так: (в следующем комментарии 🙂

2. NSDateFormatter *inFormatter = [[NSDateFormatter alloc] init]; [inFormatter setDateFormat:@»гггг-ММ-дд’Т’ХЧ: мм: ssZZZZZ»]; NSDate *inDate = [inFormatter dateFromString:[NSString stringWithFormat:@»%@»,document.created_at]]; NSDateFormatter *outFormatter =[[NSDateFormatter alloc] init]; [outFormatter setDateFormat:@»дд-ММ-гггг»]; NSString *outDate = [outFormatter stringFromDate:inDate]; self. labelCreated.text = [NSString stringWithFormat:@»%@»,устаревший];

Ответ №2:

Пожалуйста, учтите, что если вы конвертируете формат даты из строки, вы должны записать формат точно так же, как в вашей строке, с пробелами и т.д. Другие способы формат даты вернет null