2011-02-05 2 views
3

Я хотел бы показать пользователю следующие истекшее время:iPhone - 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 года назад или Отсканированные 5 секунд назад

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

одна путаница у меня есть, если у компонента даты есть значение, ** год = 2, день = 5 и минута = 10 **, то что бы вы хотели отобразить, это просто ** Отсканировано 2 года назад ** или * * Отсканировано 2 года, 5 дней и 10 минут назад **? –

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

  • Нет связанных вопросов^_^