在Swift中将计时器标签格式化为小时:分钟:秒

时间:2016-02-05 03:15:05

标签: ios swift nstimer

我有一个NSTimer,从2小时开始计算DOWN直到0。

以下是我的一些代码:

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

计时器标签是:

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

但是,我的计时器标签显示为:

Time: 200:59.0

如何将我的计时器标签格式化为:

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

[请注意我的倒数计时器没有问题,我只需要知道如何使用TimeString功能更改时间格式。]

编辑: 有人提到我的问题可能与此问题重复:Swift - iOS - Dates and times in different format。但是,我问我如何使用上面给出的TimeString函数更改时间格式。我不是要求另外一种方法来做这件事。

例如:

let minutes = Int(time) / 60

给了我“200”分钟。等

5 个答案:

答案 0 :(得分:71)

你的计算都错了。

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)

答案 1 :(得分:34)

@ rmaddy的解决方案是准确的,并回答了这个问题。但是,问题和解决方案都没有考虑到国际用户。我建议使用DateComponentsFormatter并让框架处理计算和格式化。这样做可以使您的代码更不容易出错,并且可以进一步证明未来。

我看到这篇博客文章提供了一个简洁的解决方案: http://crunchybagel.com/formatting-a-duration-with-nsdatecomponentsformatter/

从该帖子中拉出来,这是代替您当前用于进行计算的代码的代码段。更新了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) 

答案 2 :(得分:2)

Swift5

var totalHour = Int()
var totalMinut = Int()
var totalSecond = Int()
var timer:Timer?

根据需求调用startTimer()-

func startTimer(){
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countdown), userInfo: nil, repeats: true)
}

@objc func countdown() {
    var hours: Int
    var minutes: Int
    var seconds: Int

    if totalSecond == 0 {
        timer?.invalidate()
    }
    totalSecond = totalSecond - 1
    hours = totalSecond / 3600
    minutes = (totalSecond % 3600) / 60
    seconds = (totalSecond % 3600) % 60
    timeLabel.text = String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}

完成

答案 3 :(得分:0)

在Swift中实现Timer的最佳方法(swift 4可以正常工作)。 声明变量secs:Int并指定计时器的值(以秒为单位)。 然后使用Timer()函数,一次减少一秒钟并将其传递给该函数。

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

我希望我能帮助需要它的人。

答案 4 :(得分:0)

声明小时,分钟和秒变量,并复制粘贴以下代码,即可正常工作。

      if counter > 0 {

        let hours = counter / 3600

        let minutes = counter / 60

        let seconds = counter % 60

        counter = counter - 1

        timerLbl.text = "\(hours):\(minutes):\(seconds)"

    }