J'ai un NSTimer qui compte à rebours de 2 heures à 0.
Voici quelques uns de mes codes:
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'étiquette du minuteur est:
TimerLabel.text = "Time: \(timeString(timeCount))"
TOUTEFOIS, mon étiquette de minuterie indique:
Time: 200:59.0
Comment formater mon étiquette de minuterie pour qu'elle ressemble à ceci:
Time: 01:59:59 // (which is hours:minutes:seconds)?
[Veuillez noter que je n'ai aucun problème avec mon compte à rebours, il me suffit de savoir comment changer le format de l'heure à l'aide de la fonction TimeString.]
EDIT: Quelqu'un a mentionné que ma question était une copie possible de celle-ci: Swift - iOS - Dates et heures dans un format différent . CEPENDANT, je demande comment changer le format de l'heure à l'aide de la fonction TimeString que j'ai donnée ci-dessus. Je ne demande pas une autre façon de procéder.
Par exemple:
let minutes = Int(time) / 60
me donne "200" minutes. etc.
Vos calculs sont tous faux.
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)
La solution de @ rmaddy est exacte et répond à la question. Cependant, ni la question ni la solution ne prennent en compte les utilisateurs internationaux. Je suggère d'utiliser DateComponentsFormatter
et de laisser le cadre gérer les calculs et le formatage. Cela rend votre code moins sujet aux erreurs et plus évolutif.
Je suis tombé sur cet article de blog qui propose une solution concise: http://crunchybagel.com/formatting-a-duration-with-nsdatecomponentsformatter/
Extrait de cet article, il s'agit de l'extrait de code qui remplacerait le code que vous utilisez actuellement pour effectuer vos calculs. Mise à jour pour 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)
Déclarez les variables heures, minutes et secondes et copiez-collez le code ci-dessous.
if counter > 0 {
let hours = counter / 3600
let minutes = counter / 60
let seconds = counter % 60
counter = counter - 1
timerLbl.text = "\(hours):\(minutes):\(seconds)"
}
La meilleure façon d'implémenter un minuteur dans Swift (Swift 4 fonctionne bien) . Déclarez la variable secondes: Int et attribuez la valeur, en secondes, du minuteur . Puis, avec la fonction Timer (), actualisez-en une seconde à la fois et transmettez-le à cette fonction.
var secs = 0
var timer = Timer()
func startTimer(segs: Int) {
seg = segs
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerDiscount), userInfo: nil, repeats: true)
}
func timerDiscount() {
let hours = secs / 3600
let mins = secs / 60 % 60
let secs = secs % 60
let restTime = ((hours<10) ? "0" : "") + String(hours) + ":" + ((mins<10) ? "0" : "") + String(mins) + ":" + ((secs<10) ? "0" : "") + String(secs)
}
J'espère que je peux aider qui en a besoin.