Формат метки таймера в часах: минуты: секунды в Swift

у меня есть NSTimer, который отсчитывает от 2 часов до 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-даты и время в разных форматах. Однако я спрашиваю, Как изменить формат времени, используя функцию TimeString, которую я дал выше. Я не прошу другого способа, как это сделать.

например:

let minutes = Int(time) / 60

дает мне "200" минут. так далее.

3 ответов


все ваши расчеты неверны.

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)

решение@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) 

лучший способ реализовать таймер в Swift (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)
}

Я надеюсь, что смогу помочь, кому это нужно.