我从以前的各种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];
}
效果很好!
答案 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)
不幸的是,没有办法跳过计算步骤。我建议您在NSDate
或NSString
上为您撰写一个类别,并在那里实施所需的转化。