2009-10-07 24 views
6

Ich habe eine schreckliche Zeit zu versuchen, etwas zu tun, das sollte einfach sein. Ich habe einen NSNumber Wert von 32025.89 Sekunden. Ich muss das in Stunden, Minuten, Sekunden darstellen. Gibt es eine Methode, die das ausspuckt? Ich kann keinen passenden Formatierer finden.NSummer von Sekunden zu Stunden, Minuten, Sekunden

+0

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

Antwort

8

Haben Sie versucht, eine NSDate aus, dass und Druck zu schaffen, die eine NSDateFormatter mit?

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

Wenn Sie die einzelnen Werte für Stunden, Minuten benötigen, und Sekunden mit NSDateComponents wie nall vorgeschlagen.

Die oben genannten werden nicht die richtigen Beträge gedruckt, wenn die NSNumber mehr als einen Tag darstellt. Es könnte 1 Tag und 1 Stunde sein, und es würde nur 01:00:00 drucken. In diesem Fall sollten Sie Stunden, Minuten und Sekunden manuell berechnen.

+0

Dies ist eher in der Linie von dem, was ich suchte. Ich weiß, dass ich Mathe könnte, aber ich habe versucht, einen Weg zu finden, der es im Wesentlichen für mich getan hat - NSDateFormatter war ich denke, was ich brauchte. Vielen Dank. – SonnyBurnette

+0

Mit diesem Code hatte ich einen Benutzer, der einen falschen Wert erhalten hat - anstatt von 03:00 für 180 Sekunden - sie haben 33:00 bekommen. Sie waren in einer Zeitzone, die 4,5 Stunden voraus war und ich fragte mich, ob die halbe Stunde in ihrer Zeitzone möglicherweise dazu geführt haben könnte ... – petenelson

9

Wenn Sie es nicht einfach teilen wollen, versuchen Sie es. Es kann nahe genug für Ihre Zwecke sein. Hinweis: Es berücksichtigt nicht die Genauigkeit einer Sekunde. (setSecond dauert ein 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

Funktioniert nicht mehr als 24 Stunden (Stunden gehen bis 0 usw.) – Jonny

+0

was ich erwartet habe, es funktioniert gut. groß. I upvote Ihre Antwort – akk

4

Hier ist eine Art und Weise ohne Bibliotheken mit Ausnahme modf() von 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

Ich habe gerade bemerkt, dass du 0 durch 3600 teilst, um Stunden zu bekommen. Das ist ein Tippfehler, oder? Du meinst "fsec/3600" oder? – SonnyBurnette

+0

Und was hat 'frexp' damit zu tun ?? –

+0

um ... extrahiert es den Bruchteil und den ganzzahligen Teil einer floatingh Zeigerzahl. In diesem Fall die Millisekunden und Sekunden. –

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)]; 
Verwandte Themen