直接从NSTimeInterval转换为NSDateComponents到NSString?

时间:2014-04-27 18:50:23

标签: ios nsstring nsdatecomponents nstimeinterval

我从以前的各种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,以便在动态创建的几个不同标签中使用。 / p>

问题:

有没有办法从现有NSString直接转到NSTimeInterval,即没有通过fromDate/toDate rigamarole?

谢谢!

更新

根据@ 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];
}

效果很好!

2 个答案:

答案 0 :(得分:7)

为什么不使用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 rigamarole

答案 1 :(得分:0)

不幸的是,没有办法跳过计算步骤。我建议您在NSDateNSString上为您撰写一个类别,并在那里实施所需的转化。