2009-10-07 22 views
6

Mi sto divertendo terribilmente cercando di fare qualcosa che dovrebbe essere facile. Ho un valore NSNumber di 32025,89 secondi. Devo rappresentarlo in ore, minuti, secondi. C'è un metodo che lo sputa? Non riesco a trovare un formattatore adeguato.NSNumero di secondi a Ore, minuti, secondi

+0

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

risposta

8

Hai provato la creazione di un NSDate da quello e di stampa che utilizza un NSDateFormatter?

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

Se avete bisogno di valori individuali per ore, minuti e secondi, utilizzare NSDateComponents come suggerito da Nall.

Quanto sopra non stamperà gli importi corretti se lo NSNumber rappresenta più di un giorno. Potrebbe essere 1 giorno e 1 ora, e stampa solo 01:00:00. In tal caso, calcolare manualmente ore, minuti e secondi.

+0

Questo è più sulla falsariga di quello che stavo cercando. So che potevo fare i conti ma stavo cercando di trovare un modo che essenzialmente lo facesse per me - NSDateFormatter credo, quello di cui avevo bisogno. Grazie. – SonnyBurnette

+0

Utilizzando questo codice ho avuto un utente che ha ottenuto un valore errato - invece di 03:00 per 180 secondi - hanno ottenuto le 33:00. Erano in un fuso orario con 4,5 ore di anticipo e mi sono chiesto se la mezz'ora nel loro fuso orario avrebbe potuto causare questo ... – petenelson

9

Se non vuoi semplicemente dividerlo, prova questo. Potrebbe essere abbastanza vicino per i tuoi scopi. Nota: Non tiene conto della precisione sub-secondo. (setSecond prende uno 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

Non funziona oltre le 24 ore (le ore andranno a 0 ecc.) – Jonny

+0

quello che mi aspettavo, funziona perfettamente. grande. I upvote ur risposta – akk

4

Ecco un modo senza librerie ad eccezione di modf() da 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

Ho appena notato che dividi 0 per 3600 per ottenere ore. È un refuso, vero? Vuoi dire "fsec/3600" giusto? – SonnyBurnette

+0

E cosa c'entra il 'frexp' con questo ?? –

+0

um ... estrae la parte frazione e la parte intera di un numero di puntatore floatingh. In questo caso, i millisecondi e i secondi. –

2

NSNumber * valueForDisplay = [NSNumber numberWithDouble: [auto 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)]; 
Problemi correlati