Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 来自未格式化字符串的JSQMessage set date属性_Ios_Objective C_Nsdate_Jsqmessagesviewcontroller - Fatal编程技术网

Ios 来自未格式化字符串的JSQMessage set date属性

Ios 来自未格式化字符串的JSQMessage set date属性,ios,objective-c,nsdate,jsqmessagesviewcontroller,Ios,Objective C,Nsdate,Jsqmessagesviewcontroller,我从API接收聊天数据,它返回消息的日期,如下所示: 30 minutes ago 1 hour ago 2 weeks ago ... etc 但是在JSQMessage中,它只需要NSDate,我搜索了一下,没有找到一种动态的方法将其转换为没有特定格式的NSDate JSQMessage* message = [[JSQMessage alloc] initWithSenderId:@"3" senderDisplayName:@"Name" date:@

我从API接收聊天数据,它返回消息的日期,如下所示:

    30 minutes ago
    1 hour ago
    2 weeks ago 
    ... etc
但是在JSQMessage中,它只需要NSDate,我搜索了一下,没有找到一种动态的方法将其转换为没有特定格式的NSDate

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

任何帮助都将不胜感激。

最好更改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];
    }
}

我认为这不应该是一个好办法。最好是从API中获取日期的时间戳值。

我用这种方式手动执行,因为我无法控制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;
}