添加时间间隔。例如小时、分钟和秒
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:16
、00:15:02
、00: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 小时的间隔。
我从多个对象的“01:32:34”之类的响应中获取时间(以小时、分钟和秒为单位)。我将它保存在一个自定义日期对象中,我在其中保存日期值和字符串值,有大量记录,所以我将它保存在我的本地数据库中,并且在检索时我得到格式为 1999-12-31 19:01:04 +0000
而我从响应中得到的字符串值也是 19:01:04
。现在我想将所有这些值添加到 return 字符串中,例如 1:15:16
、00:15:02
、00: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 小时的间隔。