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のように表示されます。
だいぶ綺麗になったと思います。わからないことがあったら最初に公式ドキュメントをしっかり読むことが大事だなと思いました。