web-dev-qa-db-ja.com

Swiftの時間:分:秒にタイマーラベルをフォーマットします。

2時間から0までカウントダウンするNSTimerがあります。

ここに私のコードの一部があります:

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」分かかります。等.

23
mjoe7

あなたの計算はすべて間違っています。

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

@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) 
42
Mark Suman

変数hours、minutes、secondsを宣言し、以下のコードをコピーして貼り付けます。

      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

Swift(Swift 4は正常に動作します)。変数secs:Intを宣言し、タイマーの値を秒単位で割り当てます。Timer()関数を使用して、タイマーを実装する最良の方法です。 、一度に1秒ずつ割引して、この関数に渡します。

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

誰がそれを必要としているのかお役に立てれば幸いです。

0
oscar castellon