2011-02-05 3 views
3

:아이폰 - NSDateComponents/NSCalendar 및 경과 시간 나는 다음과 같은 경과 시간을 사용자에게 표시 할

예를 들어,

Scanned 13 seconds ago 
Scanned 2 minutes ago 
Scanned 1 hour ago 
Scanned 2 days ago 
Scanned 1 month ago 
Scanned 1 year ago 

내가를 사용 (예 : 3 시간 전 스캔.) 이것을 달성하기위한 방법을 따르지 만, 예상했던대로 작동하지 않습니다. 예를 들어 방금 스캔 한 내용을 출력하면 스캔 한 9 초 16 시간 전인은 분명히 올바르지 않습니다. 그것은이어야합니다 : 스캔 9 초 전.

+ (NSString *)elapsedTime:(NSDate *)date { 
    NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

    NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components:desiredComponents 
                     fromDate:date 
                      toDate:[NSDate date] 
                      options:0]; 

    NSString *stringFormat = nil; 
    stringFormat = [NSString stringWithFormat:@"%@", [elapsedTimeUnits year] > 0 ? ([NSString stringWithFormat: @"%d year%@ ", [elapsedTimeUnits year], [elapsedTimeUnits year] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits month] > 0 ? ([NSString stringWithFormat: @"%d month%@ ", [elapsedTimeUnits month], [elapsedTimeUnits month] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits week] > 0 ? ([NSString stringWithFormat: @"%d week%@ ", [elapsedTimeUnits week], [elapsedTimeUnits week] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits day] > 0 ? ([NSString stringWithFormat: @"%d day%@ ", [elapsedTimeUnits day], [elapsedTimeUnits day] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits hour] > 0 ? ([NSString stringWithFormat: @"%d hour%@ ", [elapsedTimeUnits hour], [elapsedTimeUnits hour] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits minute] > 0 ? ([NSString stringWithFormat: @"%d minute%@ ", [elapsedTimeUnits minute], [elapsedTimeUnits minute] == 1 ? @"" : @"s"]) : @""]; 
    stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits second] > 0 ? ([NSString stringWithFormat: @"%d second%@ ", [elapsedTimeUnits second], [elapsedTimeUnits second] == 1 ? @"" : @"s"]) : @""]; 

    return [NSString stringWithFormat:@"Scanned %@ago", stringFormat]; 
} 

답변

4

당신은 각 부분을 확인하고

stringFormat = [NSString stringWithFormat: @"%d", [elapsedTimeUnits year] > 0 ? ([NSString stringWithFormat: @"%d year%@", [elapsedTimeUnits year], [elapsedTimeUnits year] == 1 ? @"" : "s"]) : @""]; 

stringFormat = [NSString stringWithFormat: @"%@%@", stringFormat, [elapsedTimeUnits month] > 0 ? ([NSString stringWithFormat: @"%d month%@", [elapsedTimeUnits month], [elapsedTimeUnits month] == 1 ? @"" : "s"]) : @""]; 

이 적절한하는 단위를 변경하고 최종있는 StringFormat의 뜻을 표시하여 원하는 문자열을 포함에서 더 추가 추가해야합니다.

이 코드는 스캔 2 년 전 또는 스캔 오초 전에 코드에서

NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit 
      | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

    NSDate *date = [formatter dateFromString: @"8 02 2011 14:22:59"]; 

    NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components: desiredComponents 
                   fromDate: date 
                    toDate: [NSDate date] 
                    options:0]; 
    // format to be used to generate string to display 
    NSString *scannedFormat = @"Scanned %d %@ ago"; 
    NSInteger number = 0; 
    NSString *unit; 

    if ([elapsedTimeUnits year] > 0) { 
     number = [elapsedTimeUnits year]; 
     unit = [NSString stringWithFormat:@"year"]; 
    } 
    else if ([elapsedTimeUnits month] > 0) { 
     number = [elapsedTimeUnits month]; 
     unit = [NSString stringWithFormat:@"month"]; 
    } 
    else if ([elapsedTimeUnits week] > 0) { 
     number = [elapsedTimeUnits week]; 
     unit = [NSString stringWithFormat:@"week"]; 
    } 
    else if ([elapsedTimeUnits day] > 0) { 
     number = [elapsedTimeUnits day]; 
     unit = [NSString stringWithFormat:@"day"]; 
    } 
    else if ([elapsedTimeUnits hour] > 0) { 
     number = [elapsedTimeUnits hour]; 
     unit = [NSString stringWithFormat:@"hour"]; 
    } 
    else if ([elapsedTimeUnits minute] > 0) { 
     number = [elapsedTimeUnits minute]; 
     unit = [NSString stringWithFormat:@"minute"]; 
    } 
    else if ([elapsedTimeUnits second] > 0) { 
     number = [elapsedTimeUnits second]; 
     unit = [NSString stringWithFormat:@"second"]; 
    } 
    // check if unit number is greater then append s at the end 
    if (number > 1) { 
     unit = [NSString stringWithFormat:@"%@s", unit]; 
    } 
    // resultant string required 
    NSString *scannedString = [NSString stringWithFormat:scannedFormat, number, unit]; 
+0

몇몇 오류가 표시됩니다. 당신은 완벽한 작업 방법을 가지고 있습니까? – fuzz

+0

날짜 구성 요소에 ** year = 2, day = 5, minute = 10 ** 값이있는 경우 혼란이 있습니다. 표시하고자하는 것은 ** 단지 2 년 전에 ** ** 또는 * * 스캔 된 2 년 5 일 10 분 전 **? –

관련 문제