时间间隔格式

Time Interval Formatting

我希望显示音频剪辑的时间间隔,即: "Snippet A is from 0:20 - 0:24"

我试过像这样使用 DateIntervalFormatter:

let formatter = DateIntervalFormatter()
formatter.timeStyle = .short
formatter.dateStyle = .none

let interval = DateInterval(start: .init(), duration: 20)
let (_start, _end) = (interval.start, interval.end)
let getTimeComponents = {
    Calendar.current.dateComponents([.minute, .second], from: [=10=])
}
let startComponents = getTimeComponents(_start)
let endComponents = getTimeComponents(_end)

let dateFrom = { Calendar.current.date(from: [=10=]) }
let start = dateFrom(startComponents)!
let end = dateFrom(endComponents)!
let string = formatter.string(from: start, to: end)
print(string) // OUTPUT: "12:34 – 12:35 AM"

但格式不符合要求。我查看了 DateComponentsFormatterRelativeDateTimeFormatter,但它们似乎也没有提供所需的行为。

Foundation 中是否有 Formatter 提供此行为?考虑本地化时,手动实施此操作似乎容易出错。

由于您要格式化的内容表示分钟数和秒数,而不是一天中的时间或日期,因此您应该使用 DateComponentsFormatter.

您可以先格式化时间戳,然后使用字符串插值来包含句子的其余部分:

let start: TimeInterval = 20
let end: TimeInterval = 24

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.minute, .second]
formatter.unitsStyle = .positional
formatter.zeroFormattingBehavior = .pad
let startString = formatter.string(from: start)
let endString = formatter.string(from: end)
let result = "Snippet A is from \(startString) - \(endString)"

可以 也 "cheat" 并使用 DateIntervalFormatter...您只需将 dateTemplate 设置为所需的格式。

let formatter = DateIntervalFormatter()
formatter.dateTemplate = "m:ss"
let intervalString = formatter.string(from: Date(timeIntervalSince1970: start), to: Date(timeIntervalSince1970: end))
let result = "Snippet A is from \(intervalString)"

我觉得这是作弊,因为您实际上并没有格式化日期。如果你有一个 24 小时长的音频剪辑,并且时间戳 24:00:00,DateIntervalFormatter 将无法对其进行格式化,但 DateComponentsFormatter .也就是说,实际上并没有 TimestampIntervalFormatter...