Преобразовать напрямую из NSTimeInterval в NSDateComponents в NSString?

У меня есть несколько NSTimeInterval, полученных из предыдущих вычислений для различных NSDate. Теперь я хочу отобразить эти интервалы пользователю в формате days:hours:minutes:seconds.

Ранее в своем приложении я использовал этот код для отображения информации в немного другом контексте:

-(void)updateDurationLabel
{
    //Which calendar
    NSCalendar *calendar = [NSCalendar currentCalendar];

    //Gets the componentized interval from the most recent time an activity was tapped until now

    NSDateComponents *components= [calendar components:NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:self.startTime toDate:[NSDate date] options:0];
    NSInteger days = [components day];
    NSInteger hours = [components hour];
    NSInteger minutes = [components minute];
    NSInteger seconds =[components second];

    // Converts the components to a string and displays it in the duration label, updated via the timer

    cellLabelTempText = [NSString stringWithFormat:@"%02i:%02i:%02i:%02i",days,hours,minutes,seconds];
    self.durationOrSleepLabel.text = cellLabelTempText;
}

Однако в данном случае я бы хотел, чтобы нужный NSString производился с использованием различных уже полученных NSTimeInterval для использования в нескольких разных метках, которые создаются на лету.

Вопрос:

Есть ли какой-нибудь способ напрямую перейти к NSString из существующего NSTimeInterval, т. е. без прохождения через fromDate/toDate канитель?

Спасибо!

Обновление:

В соответствии с ответом @Rich ниже я добавил этот метод, который обошел математику:

-(void) focusItemDurationCalculator
{
    NSInteger days = ((NSInteger) focusItemDuration) / (60 * 60 * 24);
    NSInteger hours = (((NSInteger) focusItemDuration) / (60 * 60)) - (days * 24);
    NSInteger minutes = (((NSInteger) focusItemDuration) / 60) - (days * 24 * 60) - (hours * 60);
    NSInteger seconds = ((NSInteger) round(focusItemDuration)) % 60;

    actualDurationFocusItem = [NSString stringWithFormat:@"%02i:%02i:%02i:%02i",days,hours,minutes,seconds];
}

Работает отлично!


person rattletrap99    schedule 27.04.2014    source источник


Ответы (2)


Почему бы просто не использовать NSTimeInterval и не рассчитать каждый компонент самостоятельно. Вы также можете отказаться от использования [NSDate date] и использовать timeIntervalSinceNow.
Вы можете использовать целочисленное деление, чтобы отбросить дробную часть каждого компонента.

// Use abs if you don't care about direction
NSTimeInterval duration = abs([self.startTime timeIntervalSinceNow]);

NSInteger days = ((NSInteger) duration) / (60 * 60 * 24);
NSInteger hours = (((NSInteger) duration) / (60 * 60)) - (days * 24);
NSInteger minutes = (((NSInteger) duration) / 60) - (days * 24 * 60) - (hours * 60);
NSInteger seconds = ((NSInteger) round(duration)) % 60;

Это должно быть быстрее, чем иметь дело с NSDateComponents. Это не совсем то, что вы ищете, но оно охватывает это: D

не проходя через ригамарол fromDate/toDate

person Rich    schedule 27.04.2014
comment
@TimJones Я богат :P - person Rich; 28.04.2014
comment
Хотя я отпущу вас, если вы укажете правильное имя в своем обновлении вопроса, ха-ха: D - person Rich; 28.04.2014
comment
Прости, Рич! Система инвертировала порядок ответов, а я даже не смотрел текст, когда забивал название для обновления. Теперь это исправлено, и еще раз спасибо! - person rattletrap99; 28.04.2014

К сожалению, нет возможности пропустить этап расчета. Я бы порекомендовал написать вам категорию на NSDate или NSString и внедрить там нужную конверсию.

person nburk    schedule 27.04.2014
comment
Спасибо, Николас! Оказывается, все-таки был способ. Быстро и грязно, но вполне адекватно рассматриваемой проблеме. Пожалуйста, смотрите обновление выше. - person rattletrap99; 28.04.2014
comment
привет, Тим, а, хорошо, но это также происходит через NSDate (это то, что происходит в [self.startTime timeIntervalSinceNow]), так что это не напрямую из NSTimeInterval. В любом случае, рад, что это работает для вас сейчас! и кстати, если вы используете этот код чаще, я бы порекомендовал поместить его в категорию, чтобы вы могли легко получить к нему доступ, когда вам это нужно :-) - person nburk; 28.04.2014
comment
@Nikolas-- Точка хорошо принята. Однако в этом конкретном случае, как я указал в вопросе, NSTimeIntervals уже были рассчитаны в другом месте, поэтому они уже были доступны как удвоения. - person rattletrap99; 28.04.2014