2016-02-05 16 views
10

Ho un NSTimer che conta giù da 2 ore fino a 0.formato di etichetta timer ore: minuti: secondi in Swift

Ecco alcuni del mio codice:

var timer = NSTimer() 
let timeInterval:NSTimeInterval = 0.5 
let timerEnd:NSTimeInterval = 0.0 
var timeCount:NSTimeInterval = 7200.0 // seconds or 2 hours 

// TimeString Function 

func timeString(time:NSTimeInterval) -> String { 
    let minutes = Int(time)/60 
    let seconds = time - Double(minutes) * 60 
    let secondsFraction = seconds - Double(Int(seconds)) 
    return String(format:"%02i:%02i.%01i",minutes,Int(seconds),Int(secondsFraction * 10.0)) 
} 

L'Etichetta timer è:

TimerLabel.text = "Time: \(timeString(timeCount))" 

Tuttavia, la mia etichetta timer mostra come:

Time: 200:59.0 

Come faccio a formattare la mia etichetta timer per assomigliare a questo:

Time: 01:59:59 // (which is hours:minutes:seconds)? 

[Si prega di notare che non ho problemi con la mia conto alla rovescia, ho solo bisogno di sapere come modificare il formato dell'ora utilizzando la funzione di TimeString.]

MODIFICA: Qualcuno ha detto che la mia domanda è un possibile duplicato di questo: Swift - iOS - Dates and times in different format. TUTTAVIA, sto chiedendo come faccio a cambiare il formato dell'ora utilizzando la funzione TimeString che ho dato sopra. Non sto chiedendo un altro modo su come farlo.

Per esempio:

let minutes = Int(time)/60 

mi da "200" minuti. ecc.

+2

Possibile duplicato di [Swift - IOS - Date e orari in formato diverso] (http://stackoverflow.com/questions/28489227/swift-ios-dates-and-times-in -differente-formato) – Abhijeet

+0

Dov'è il tuo calcolo delle ore? – rmaddy

+1

@Abhijeet Che non è nemmeno lontanamente vicino ad essere un duplicato di questa domanda. Questa domanda non ha a che fare con un 'NSDate' e la soluzione di questa domanda non ha nulla a che fare con' NSDateFormatter'. – rmaddy

risposta

52

I tuoi calcoli sono tutti sbagliati.

let hours = Int(time)/3600 
let minutes = Int(time)/60 % 60 
let seconds = Int(time) % 60 
return String(format:"%02i:%02i:%02i", hours, minutes, seconds) 
14

La soluzione di @ rmaddy è accurata e risponde alla domanda. Tuttavia, né la domanda né la soluzione prendono in considerazione gli utenti internazionali. Suggerisco di usare DateComponentsFormatter e lasciare che il framework gestisca i calcoli e la formattazione. In questo modo il tuo codice sarà meno incline agli errori e più a prova di futuro.

mi sono imbattuto in questo post del blog che fornisce una soluzione concisa: http://crunchybagel.com/formatting-a-duration-with-nsdatecomponentsformatter/

tirato da quel posto, questo è il frammento di codice che dovrebbe sostituire il codice che si sta usando per fare i vostri calcoli. Aggiornato per Swift 3:

let duration: TimeInterval = 7200.0 

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .positional // Use the appropriate positioning for the current locale 
formatter.allowedUnits = [ .hour, .minute, .second ] // Units to display in the formatted string 
formatter.zeroFormattingBehavior = [ .pad ] // Pad with zeroes where appropriate for the locale 

let formattedDuration = formatter.string(from: duration) 
+0

Buon punto, tuttavia ci sono alcuni casi in cui la risposta di maddy è sufficiente. Ad esempio se si effettua l'applicazione solo per una localizzazione. – Markus

+1

Ottima risposta, avevo dimenticato come fare questo. –