2017-02-16 7 views
0

Я получаю данные чата из API и возвращает дату сообщения следующим образом:JSQMessage набор атрибутов даты из бесформатного Строка

30 minutes ago 
    1 hour ago 
    2 weeks ago 
    ... etc 

Но в JSQMessage он принимает только NSDate, и я искал и не удалось найти динамический способ преобразования, что к NSDate без определенного формата

JSQMessage* message = [[JSQMessage alloc] initWithSenderId:@"3" senderDisplayName:@"Name" date:@"" text:@"msg"]; 

Любая помощь будет высоко ценится.

ответ

0

Я сделал это вручную этот путь, так как я не имею никакого контроля над API

- (int) getCountFromDisplayDate : (NSString*) date { 
    NSString* number = @""; 
    for (int i = 0;i < date.length;i ++) 
     if ([date characterAtIndex:i] == ' ') 
      break; 
     else 
      number = [NSString stringWithFormat:@"%@%c",number,[date characterAtIndex:i]]; 
    if ([number intValue]) 
     return [number intValue]; 

    return 0; 
} 

- (NSDate*) dateForIndexPath:(NSIndexPath*) indexPath { 
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat: @"MM/dd/yyyy"]; 
    NSString* displayDate= _chat[indexPath.item][@"DisplayDate"]; 

    NSString* whatWeDisplay = @""; 
    if ([displayDate containsString:@"ago"]) { 
     int count = [self getCountFromDisplayDate : displayDate] * -1; 
     if ([displayDate containsString:@"second"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count]]; 
     } 
     else if ([displayDate containsString:@"minute"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60]]; 
     } 
     else if ([displayDate containsString:@"hour"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60 * 60]]; 
     } 
     else if ([displayDate containsString:@"day"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 24 * 60 * 60]]; 
     } 
     else if ([displayDate containsString:@"week"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 7 * 24 * 60 * 60]]; 
     } 
     else if ([displayDate containsString:@"month"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 30 * 24 * 60 * 60]]; 
     } 
     else if ([displayDate containsString:@"year"]) { 
      whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 365 * 30 * 24 * 60 * 60]]; 
     } 

    } 
    else 
     whatWeDisplay = displayDate; 
    NSDate* theDate = [dateFormatter dateFromString:whatWeDisplay]; 
    if (!theDate) { 

     return [NSDate date]; 
    } 
    return theDate; 
} 
1

Лучше изменить ответ API. В качестве альтернативы вы можете использовать функцию ниже.

-(void)getLocationDetails:(NSString *)strDiffFrmAPI{ 
    NSDate *dateActual; 
    if ([strDiffFrmAPI isEqualToString:@"30 minutes ago"]) { 
     dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMinute 
                     value:-30 
                    toDate:[NSDate date] 
                  options:0]; 
    } 
    else if ([strDiffFrmAPI isEqualToString:@"1 hour ago"]){ 
     dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitHour 
                     value:-1 
                    toDate:[NSDate date] 
                    options:0]; 
    } 
    else if ([strDiffFrmAPI isEqualToString:@"2 weeks ago"]){ 
     dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay 
                     value:(-7*2) 
                    toDate:[NSDate date] 
                    options:0]; 
    } 
} 

Я считаю, что это не должно быть хорошим подходом. Лучше, если вы получите значение timestamp для Date from API.

+0

я сделал это в более динамично, благодаря –

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