Время в формате Objective-C осталось до определенной даты - PullRequest
0 голосов
/ 14 августа 2011

Я создаю таймер обратного отсчета, и мне нужно распечатать оставшееся время (час: минута: секунды) до определенной даты. Я нашел, как получить временной интервал между Сейчас и целевой датой, но я не знаю, как отформатировать временной интервал в виде строки. NSDateFormater работает на NSTimeInterval?

Ответы [ 3 ]

5 голосов
/ 15 августа 2011

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];
}
3 голосов
/ 14 августа 2011

Сначала вы должны сравнить два объекта 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 голосов
/ 02 января 2013

Это код из моего проекта:

-(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 слева).

В любом случае, прогресс плохойдолжна быть видна во время длительной работы

Еще одна мысль: в случае, если оставшееся время «мало» (меньше минуты?), вероятно, оставшееся время не должно отображаться - просто индикатор выполнения слева, чтобы уменьшить интерфейс"визуальный шум".

...