NSNumber секунд до часов, минут, секунд - PullRequest
6 голосов
/ 07 октября 2009

Я ужасно стараюсь сделать что-то, что должно быть легко. У меня есть NSNumber значение 32025,89 секунд. Мне нужно представить это в часах, минутах, секундах. Есть ли метод, который выплевывает это? Я не могу найти правильный форматер.

Ответы [ 4 ]

9 голосов
/ 07 октября 2009

Вы пытались создать NSDate из этого и распечатать его, используя NSDateFormatter?

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[theNumber doubleValue]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSLog(@"%@", [formatter stringFromDate:date]); 
[formatter release];

Если вам нужны отдельные значения часов, минут и секунд, используйте NSDateComponents, как предложено nall.

Выше не будет печатать правильные суммы, если NSNumber представляет более одного дня. Это может быть 1 день и 1 час, и будет напечатано только 01:00:00. В таком случае вы должны рассчитать часы, минуты и секунды вручную.

9 голосов
/ 07 октября 2009

Если вы не хотите просто делить это, попробуйте это. Это может быть достаточно близко для ваших целей. Примечание: Это не учитывает точность до секунды. (setSecond занимает NSInteger).

NSDateComponents* c = [[[NSDateComponents alloc] init] autorelease];
[c setSecond:32025.89];

NSCalendar* cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
                   autorelease];

NSDate* d = [cal dateFromComponents:c];

NSDateComponents* result = [cal components:NSHourCalendarUnit |
                                           NSMinuteCalendarUnit |
                                           NSSecondCalendarUnit
                                  fromDate:d];

NSLog(@"%d hours, %d minutes, %d seconds",
    [result hour], [result minute], [result second]);
4 голосов
/ 07 октября 2009

Вот способ без каких-либо библиотек, кроме modf() из math.h:

float fsec = 32025.89f, frac = 0;
int milliseconds = (int)(modf(fsec, &frac) * 1000);
int isec = (int)frac;
int hours = isec / 3600;
int minutes = (isec % 3600) / 60;
int seconds = isec % 60;
2 голосов
/ 18 апреля 2012

NSNumber * valueForDisplay = [NSNumber numberWithDouble: [self valueForDisplay: clockName]];

NSNumber *totalDays = [NSNumber numberWithDouble:
         ([valueForDisplay doubleValue] / 86400)];
NSNumber *totalHours = [NSNumber numberWithDouble:
         (([valueForDisplay doubleValue] / 3600) -
          ([totalDays intValue] * 24))];
NSNumber *totalMinutes = [NSNumber numberWithDouble:
         (([valueForDisplay doubleValue] / 60) -
         ([totalDays intValue] * 24 * 60) -
         ([totalHours intValue] * 60))];
NSNumber *totalSeconds = [NSNumber numberWithInt:
         ([valueForDisplay intValue] % 60)];
...