我将假设“01:32:34”表示经过的时间为 5,554 秒,而不是凌晨 1:32。所以,我会将其转换为TimeInterval,而不是Date:
func timeInterval(from string: String) -> TimeInterval? {
let components = string.components(separatedBy: ":").map { Double($0) }
guard
components.count == 3,
let hours = components[0],
let minutes = components[1],
let seconds = components[2]
else { return nil }
return ((hours * 60) + minutes) * 60 + seconds
}
您可以选择存储原始的“01:32:34”字符串或此值 5,554.0。
无论如何,添加这些数字时间间隔是微不足道的。要显示生成的TimeInterval,您可以使用DateComponentsFormatter,例如
let timeIntervalFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour, .minute, .second]
return formatter
}()
func totalElapsed(_ strings: [String]) -> String? {
let total = strings.reduce(TimeInterval.zero) { sum, string in
sum + (timeInterval(from: string) ?? 0)
}
return timeIntervalFormatter.string(from: total)
}
let strings = ["1:15:16", "00:15:02", "00:45:27"]
let result = totalElapsed(strings)
02:15:45
或者,如果您想要更多(本地化)自然语言表示,请使用 unitsStyle of .full:
2 小时 15 分 45 秒
这种方法(使用TimeInterval,而不是Date)的优点是它还可以表示超过24 小时的时间间隔。