Swiftで経過時間を表示する

秒数を整数にして自力で計算する

タイマーで繰り返し経過時間を表示させる場合は、整数にして計算すると速いです。

// 適当に開始時点の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が用意されているので、言語ごとに最適な形式で出力したい場合に役立ちます。