2009-10-07 11 views
6

Mam straszny czas próbując zrobić coś, co powinno być łatwe. Mam wartość NSNumber 32025.89 sekund. Muszę to reprezentować w godzinach, minutach, sekundach. Czy istnieje metoda, która to wypluwa? Nie mogę znaleźć właściwego formatyzatora.NSNumber of seconds to Hours, minutes, seconds

+0

Duplikat http://stackoverflow.com/questions/1237778/how-do-i-break-down-an-nstimeinterval-into-year-months-days-hours-minutes-and. –

Odpowiedz

8

Czy próbowałeś tworzenia NSDate z tego i że drukowanie przy użyciu NSDateFormatter?

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

Jeśli potrzebujesz poszczególne wartości na godziny, minuty i sekundy, użyj NSDateComponents jak sugeruje Nall.

Powyższe nie wydrukuje prawidłowych kwot, jeśli NSNumber reprezentuje więcej niż jeden dzień. Może to być 1 dzień i 1 godzina, a wydruk będzie drukowany tylko o 01:00:00. W takim przypadku należy ręcznie obliczyć godziny, minuty i sekundy.

+0

To jest bardziej zgodne z tym, czego szukałem. Wiem, że mogę od matematyki, ale starałem się znaleźć sposób, który w zasadzie zrobił to dla mnie - NSDateFormatter było chyba, czego potrzebowałem. Dzięki. – SonnyBurnette

+0

Używając tego kodu, miałem użytkownika, który dostał nieprawidłową wartość - zamiast 03:00 przez 180 sekund - otrzymali 33:00. Byli w strefie czasowej, która była 4,5 godziny do przodu i zastanawiałem się, czy pół godziny w ich strefie czasowej mogło spowodować to ... – petenelson

9

Jeśli nie chcesz po prostu podzielić, spróbuj tego. Może być wystarczająco blisko do twoich celów. Uwaga: Nie uwzględnia dokładności pod sekundę. (setSecond ma 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]); 
+0

Nie działa po 24 godzinach (godziny pójdą do 0 itd.) – Jonny

+0

czego się spodziewałem, działa dobrze. wspaniały. Przekazałem odpowiedź: – akk

4

Oto sposób bez bibliotek wyjątkiem modf() z 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; 
+0

Właśnie zauważyłem, że dzielisz 0 przez 3600, aby uzyskać godziny. To literówka, prawda? Chcesz powiedzieć "fsec/3600", prawda? – SonnyBurnette

+0

A co ma z tym wspólnego 'frexp'? –

+0

um ... wyodrębnia część ułamkową i część całkowitą liczby zmiennoprzecinkowej. W tym przypadku milisekundy i sekundy. –

2

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)]; 
Powiązane problemy