2009-11-16 16 views
59

Sono alle prese con questo. Ho un valore in secondi che voglio visualizzare in un'etichetta in formato HH: MM. Ho cercato internet per anni e ho trovato alcune risposte, ma o non le ho completamente comprese, o mi sembra uno strano modo di fare quello che voglio. Se qualcuno potesse darmi una mano su questo, sarebbe fantastico! Tieni presente che sono nuovo in questi giochi, quindi questa domanda potrebbe sembrare davvero basilare per i più esperti là fuori.Convertire numero intero intero per HH: MM, iPhone

+0

Date un'occhiata a una [domanda simile ho chiesto qualche tempo fa] (http://stackoverflow.com/questions/1025192/memory-leaks-formatting-a-string-to-display-time-each -secondo) che copre anche l'aspetto della memoria e dell'efficienza. –

risposta

236

Stavo cercando la stessa cosa che stai cercando, ma non ho trovato uno. Così ho scritto uno -

- (NSString *)timeFormatted:(int)totalSeconds 
{ 

    int seconds = totalSeconds % 60; 
    int minutes = (totalSeconds/60) % 60; 
    int hours = totalSeconds/3600; 

    return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; 
} 

funziona perfettamente in Swift così:

func timeFormatted(totalSeconds: Int) -> String { 
    let seconds: Int = totalSeconds % 60 
    let minutes: Int = (totalSeconds/60) % 60 
    let hours: Int = totalSeconds/3600 
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds) 
} 
+0

Grazie per la risposta, sembra che ho bisogno, ma non riesco a usarlo senza errori. Sono convinto che l'errore sia dalla mia parte. Se non ti dispiace aiutarmi ulteriormente: Il mio valore è un float ed è in secondi. L'ho visualizzato in un'etichetta quando viene premuto un pulsante. Dove andrà il tuo codice e come faccio a far visualizzare la mia etichetta il valore nel formato HH: MM? Molte grazie, Stu – Stumf

+0

Ordinato, grazie per il vostro aiuto. La tua risposta e http://stackoverflow.com/questions/1259028/convert-nsnumber-double-value-time-time risposta di Pholker erano la ragione per cui potevo farlo! Grazie ancora – Stumf

+0

Grandi cose - ha reso questo un metodo di classe e lo ha inserito in una categoria su NSString. D'accordo con il bitcruncher, molto pulito. –

9

Questo è come lo faccio:

-(NSString *)formatTimeFromSeconds:(int)numberOfSeconds 
{ 

    int seconds = numberOfSeconds % 60; 
    int minutes = (numberOfSeconds/60) % 60; 
    int hours = numberOfSeconds/3600; 

    //we have >=1 hour => example : 3h:25m 
    if (hours) { 
     return [NSString stringWithFormat:@"%dh:%02dm", hours, minutes]; 
    } 
    //we have 0 hours and >=1 minutes => example : 3m:25s 
    if (minutes) { 
     return [NSString stringWithFormat:@"%dm:%02ds", minutes, seconds]; 
    } 
    //we have only seconds example : 25s 
    return [NSString stringWithFormat:@"%ds", seconds]; 
} 
7

per SWIFT:

func formatTimeInSec(totalSeconds: Int) -> String { 
    let seconds = totalSeconds % 60 
    let minutes = (totalSeconds/60) % 60 
    let hours = totalSeconds/3600 
    let strHours = hours > 9 ? String(hours) : "0" + String(hours) 
    let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes) 
    let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds) 

    if hours > 0 { 
     return "\(strHours):\(strMinutes):\(strSeconds)" 
    } 
    else { 
     return "\(strMinutes):\(strSeconds)" 
    } 
} 
30

In i OS 8.0 e versioni successive possono anche essere eseguite con NSDateComponentsFormatter. Devo dire che formatterà la stringa senza il primo zero iniziale, ad esempio '9:30', ma non '09: 30 '. Ma se si desidera utilizzare formattatori, è possibile utilizzare questo codice:

-(NSString *)getTimeStringFromSeconds:(double)seconds 
{ 
    NSDateComponentsFormatter *dcFormatter = [[NSDateComponentsFormatter alloc] init]; 
    dcFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; 
    dcFormatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute; 
    dcFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; 
    return [dcFormatter stringFromTimeInterval:seconds]; 
} 
+0

Se si desidera ottenere anche secondi nel risultato, è necessario aggiungere l'unità 'NSCalendarUnitSecond' agliUnits consentiti. Questo esempio funziona anche per le applicazioni Mac OS X. – edukulele

+0

Questo si aspetta un doppio non un int. Almeno in Swift. –

0

per SWIFT con orologio contare

var timer = NSTimer() 
    var count = 1 
    func updateTime() { 
     count++ 
     let seconds = count % 60 
     let minutes = (count/60) % 60 
     let hours = count/3600 
     let strHours = hours > 9 ? String(hours) : "0" + String(hours) 
     let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes) 
     let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds) 

     if hours > 0 { 
      clockOutlet.text = "\(strHours):\(strMinutes):\(strSeconds)" 
     } 
     else { 
      clockOutlet.text = "\(strMinutes):\(strSeconds)" 
     } 
    } 
6

Mentre @Aks' answer per lavori Swift, sono un po 'scettico su hardcoding valori nel mio codice @ edukulele's answer è molto più pulito ma è in Objective-C. L'ho tradotto a Swift con un leggero cambiamento. Normalmente scrivo i miei formattatori come lazy var s.

private lazy var dateFormatter: NSDateComponentsFormatter = { 
    let formatter = NSDateComponentsFormatter() 
    formatter.zeroFormattingBehavior = .Pad 
    formatter.allowedUnits = [.Hour, .Minute, .Second] 
    formatter.unitsStyle = .Positional 
    return formatter 
}() 
+0

Questo è 'H: MM', non' HH: MM' come richiesto. –

Problemi correlati