web-dev-qa-db-fra.com

Formatez l'étiquette de la minuterie en heures: minutes: secondes dans Swift

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.

15
mjoe7

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)
64
rmaddy

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) 
31
Mark Suman

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)"

    }
0
Prashanth Pasi

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.

0
oscar castellon