Objective-c格式时间一直到特定日期

时间:2011-08-14 19:36:51

标签: objective-c nsdate nstimeinterval

我正在创建倒数计时器,我需要打印剩余时间(小时:分钟:秒)直到特定日期。我已经找到了如何获得Now和目标日期之间的时间间隔,但我不知道如何将时间间隔格式化为字符串。 NSDateFormater是否适用于NSTimeInterval?

3 个答案:

答案 0 :(得分:5)

NSTimeInterval在几秒钟内,使用除法和余数来分解和格式化(代码未经测试):

NSString *timeIntervalToString(NSTimeInterval interval)
{
   long work = (long)interval; // convert to long, NSTimeInterval is *some* numeric type

   long seconds = work % 60;   // remainder is seconds
   work /= 60;                 // total number of mins
   long minutes = work % 60;   // remainder is minutes
   long hours = work / 60      // number of hours

   // now format and return - %ld is long decimal, %02ld is zero-padded two digit long decimal 
   return [NSString stringWithFormat:@"%ld:%02ld:%02ld", hours, minutes, seconds];
}

答案 1 :(得分:3)

您首先要比较两个NSDate对象,以检索两者之间的差异,您应该使用的NSDate方法是

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate

然后你可以简单地编写一个函数来将秒解析为小时/分钟/秒,例如你可以使用它(未经测试):

-(NSDictionary*)createTimemapForSeconds:(int)seconds{
   int hours = floor(seconds /  (60 * 60) );

   float minute_divisor = seconds % (60 * 60);
   int minutes = floor(minute_divisor / 60);

   float seconds_divisor = seconds % 60;
   seconds = ceil(seconds_divisor);

   NSDictionary * timeMap = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:hours], [NSNumber numberWithInt:minutes], [NSNumber numberWithInt:seconds], nil] forKeys:[NSArray arrayWithObjects:@"h", @"m", @"s", nil]];

   return timeMap;
}

答案 2 :(得分:2)

这是我项目的代码:

-(NSString*)timeLeftString
{
    long seconds = [self msLeft]/1000;
    if( seconds == 0 )
        return @"";
    if( seconds < 60 )
        return [NSString stringWithFormat:
            pluralString(seconds,
            NSLocalizedString(@"en|%ld second left|%ld seconds left", @"")), seconds];
    long minutes = seconds / 60;
    seconds -= minutes*60;
    if( minutes < 60 ) 
        return [NSString stringWithFormat: 
            NSLocalizedString(@"%ld:%02ld left",@""),
            minutes, seconds];    
    long hours = minutes/60;
    minutes -= hours*60;
    return [NSString stringWithFormat:
        NSLocalizedString(@"%ld:%02ld:%02ld left",@""),
        hours, minutes, seconds];    
}

msLeft ---我的函数以毫秒为单位返回时间 pluralString ---我的函数根据值提供格式字符串的不同部分(http://translate.sourceforge.net/wiki/l10n/pluralforms)

函数为不同的计时器值返回不同的格式(左边1秒,左边5秒,左边2:34,左边1:15:14)。

在任何情况下,在长时间操作期间都应该看到进度不良

还有一个想法:如果剩下的时间是“小”(不到一分钟?),可能不会显示剩余的时间 - 只剩下进度条以减少界面“视觉噪音”。