有没有更好的方法来计算时间段?

时间:2011-06-26 21:59:26

标签: iphone objective-c cocoa-touch performance nsdate

我有以下代码。这是在cellForRowAtIndexPath中计算的,所以我认为它可能有点贵。有没有更好的方法来计算时间段?

+(NSString*)toShortTimeIntervalString:(NSString*)sDate  
{ 
    NSDateFormatter* df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    NSDate* date = [df dateFromString:[sDate stringByReplacingOccurrencesOfString:@"Z" withString:@"-0000"]];
    [df release];

    NSDate* today = [[NSDate alloc] init];
    NSDate *d = date; //[_twitter_dateFormatter dateFromString:sDate];
    NSTimeInterval interval = [today timeIntervalSinceDate:d];
    [today release];

    //TODO: added ABS wrapper
    double res = 0;
    NSString* result;
    if(interval > SECONDS_IN_WEEK)
    {
        res = fabs(interval / SECONDS_IN_WEEK);
        result = [NSString stringWithFormat:@"%1.0fw ago", res];
    }
    else if(interval > SECONDS_IN_DAY)
    {
        res = fabs(interval / SECONDS_IN_DAY);
        result = [NSString stringWithFormat:@"%1.0fd ago", res];
    }
    else if (interval > SECONDS_IN_HOUR){
        res = fabs(interval / SECONDS_IN_HOUR);
        result = [NSString stringWithFormat:@"%1.0fh ago", res];
    }
    else if (interval > SECONDS_IN_MIN) {
        res = fabs(interval / SECONDS_IN_MIN);
        result = [NSString stringWithFormat:@"%1.0fm ago", res];
    }
    else
    {
        interval = fabs(interval);
        result = [NSString stringWithFormat:@"%1.0fs ago", interval];
    }
    return result;
}

3 个答案:

答案 0 :(得分:1)

这看起来并不太糟糕,我怀疑你会看到太多的性能损失。为了提高效率,您可以考虑仅创建一个NSDataFormatter(将其保存在实例变量或static变量中)并重用它。或者甚至更好,如果您事先可以将所有内容转换为NSDates,那么您不必每次都使用格式化程序。

你真的在这里看到任何性能问题吗?在您尝试优化之前,您应该使用Instruments来调查实际占用时间的内容。

答案 1 :(得分:0)

不是真的,但有一个few categories,它封装了那个逻辑并让它成为你的单行调用。

答案 2 :(得分:0)

最近,我一直处于执行复杂计算的情况(绘制一系列年份的图表),我在循环中使用NSDate。用时间分析器NSDate,NSDateFormater分析后,NSCalendar是根本原因。我切换到使用C类型(time_t + timeinfo),它大大提高了速度。

虽然速度要快得多,但它们的功能较少,如果需要处理TimeZone等,NSDate可能更容易处理。