Swiftで経過時間を表示する
2021/01/12

秒数を整数にして自力で計算する
タイマーで繰り返し経過時間を表示させる場合は、整数にして計算すると速いです。
// 適当に開始時点のDateを用意する
let startDate = Date().addingTimeInterval(-180071.3325)
// 開始からの経過秒数を取得する
let timeInterval = Date().timeIntervalSince(startDate)
let time = Int(timeInterval)
let d = time / 86400
let h = time / 3600 % 24
let m = time / 60 % 60
let s = time % 60
// ミリ秒
let ms = Int(timeInterval * 100) % 100
let string = String(format: "%d日%d時間%d分%d.%d秒", d, h, m, s, ms)
// 2日2時間1分11.33秒
print(string)
DateComponentsFormatterを利用する
クラスを使っても同様のことができます。
// ロケール用のカレンダーを準備する
var calendar = Calendar.current
calendar.locale = Locale(identifier: "ja_JP")
let formatter = DateComponentsFormatter()
formatter.calendar = calendar
formatter.unitsStyle = .full
formatter.allowedUnits = [.day, .hour, .minute, .second]
formatter.zeroFormattingBehavior = [.dropLeading]
let string = formatter.string(from: timeInterval)!
// 2日 2時間 1分 11秒
print(string)
今回は単なる経過時間でしたが、年月日や曜日を扱いたい場合は、うるう年や時差、ロケール、暦法が考慮されているクラスを活用しましょう。
また、時間に限らず様々な数量を扱えるMeasurementを使う方法もあります。これにもフォーマッターMeasurementFromatterが用意されているので、言語ごとに最適な形式で出力したい場合に役立ちます。