添加时间间隔。例如小时、分钟和秒

Adding Time Interval. e.g hours, minutes and seconds

我从多个对象的“01:32:34”之类的响应中获取时间(以小时、分钟和秒为单位)。我将它保存在一个自定义日期对象中,我在其中保存日期值和字符串值,有大量记录,所以我将它保存在我的本地数据库中,并且在检索时我得到格式为 1999-12-31 19:01:04 +0000 而我从响应中得到的字符串值也是 19:01:04。现在我想将所有这些值添加到 return 字符串中,例如 1:15:1600:15:0200:45:27 应该 return 2 小时 15 分 45 秒。我探索了 Calendar.Components.byAdding,但那里的方法只允许我添加一个组件,它不接收数组和 return Date。有什么快速的方法可以实现这一点,我想通过一种优雅而适当的方法来实现这一点,我可以想到一些修复方法,但它们似乎并不合适。

我假设“01:32:34”表示经过的时间为 5,554 秒,而不是 1:32am。所以,我会将其转换为 TimeInterval,而不是 Date:

func timeInterval(from string: String) -> TimeInterval? {
    let components = string.components(separatedBy: ":").map { Double([=10=]) }
    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 hours, 15 minutes, 45 seconds

这种方法(使用 TimeInterval,而不是 Date)的优点是它还可以表示超过 24 小时的间隔。