Dateの差分は標準ライブラリでスマートに

アプリの中で、アップデート時間を計測する機能を実装したのですが、今まで日付の計算をしたことがなくDate型を使わずにString型で取得した時間データをsplitして差分を求めて…
と実装してしまったのですが、よくよく調べてみるとDate型に差分を取得するメソッドが用意されていました。

Dateを知らなかった私の冗長な実装

現在時刻を取得する方法がよくわからずStirngで取得する方法を発見したのでnowTime()で取得したHH:mm:ssのデータをtimeDurationの中で泥臭くparseしています。

コード


let start = nowtime()
sleep(65)
let end = nowtime()

print(timeDuration(start: start, end: end))

func timeDuration(start: String, end: String) -> String {
    let startArr = start.split(separator: ":")
    let endArr = end.split(separator: ":")
    
    // Note: - マイナスになってしまった時の処理
    let secondsDiff: Int = Int(endArr[2])! - Int(startArr[2])!
    let minuteDiff: Int = Int(endArr[1])! - Int(startArr[1])!
    
    var minute = minuteDiff
    var seconds = secondsDiff
    if secondsDiff < 0 {
        minute = (minute - 1)
        seconds = (seconds + 60)
        if minuteDiff < 0 {
            minute = (minute + 60)
        }
    }
    return "\(zeroPadding(check: minute)):\(zeroPadding(check: seconds))"
}

private func zeroPadding(check val: Int) -> String {
    if val % 100 < 10 {
        return "0\(val)"
    }
    return val.description
}

private func nowtime() -> String {
    let format = DateFormatter()
    format.dateFormat = "HH:mm:ss"
    return format.string(from: Date())
}

時間の差分を取得する際にになる可能性があり、その点をカバーするのに冗長な書き方になってしまっていました。

Dateを活用した実装

これを知らなかったのが一番大きいですが、現在時刻はDate()で取得できます!!

差分はtimeIntervalSince()というメソッドが用意されていたのでそれを使用しました。

コード

func timeDuration(start: Date, end: Date) -> String {
    let diff: Int = Int(end.timeIntervalSince(start))
    
    let minute = diff / 60
    let second = diff % 60
    
    return "\(zeroPadding(check: minute))分\(zeroPadding(check:second))秒"
}

private func zeroPadding(check val: Int) -> String {
    if val % 100 < 10 {
        return "0\(val)"
    }
    return val.description
}

let start = Date()
sleep(65)
let end = Date()

print(timeDuration(start: start, end: end))

printされる表示時刻は01:05のように表示されます。

だいぶ綺麗になったと思います。わからないことがあったら最初に公式ドキュメントをしっかり読むことが大事だなと思いました。

Swift

前の記事

正規表現を学んでみる
Swift

次の記事

単一責任の原則(SRP)