时间间隔格式化

问题描述 投票:0回答:1

我想从一个音频片段中显示一个时间间隔,即:。"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: $0)
}
let startComponents = getTimeComponents(_start)
let endComponents = getTimeComponents(_end)

let dateFrom = { Calendar.current.date(from: $0) }
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但它们似乎也没有提供理想的行为。

是否有一个 Formatter 在Foundation中提供这种行为?在考虑本地化时,手动实现这个似乎容易出错。

ios swift time localization date-formatting
1个回答
1
投票

由于你要格式化的东西代表的是一个分和秒的数字,而不是一天的时间或日期,你应该使用 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)"

可以 也会 "作弊",用 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...

© www.soinside.com 2019 - 2024. All rights reserved.