如何使用新的 Foundation 格式化方法来格式化时间间隔?

Tru*_*an1 2 duration formatter nsdatecomponents swift nsdatecomponentsformatter

我正在尝试将其DateComponentsFormatter与新的 Foundation 格式化程序一起使用。要格式化日期,我可以这样做:

Date.now.formatted(.dateTime.hour().minute().second())
// 5:03:17 PM
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试使用这个新的 API 来使用DateComponentsFormatter

let duration: TimeInterval = 0

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.minute, .second]
formatter.zeroFormattingBehavior = [.pad]

let formattedDuration = formatter.string(from: 0)
// 00:00
Run Code Online (Sandbox Code Playgroud)

如何使用新的 Foundation 格式化程序 API 来DateComponentsFormatter实现此目的?

Leo*_*bus 11

AFAIK 时间间隔的格式化方法仅适用于Duration需要用以下方式初始化的对象timeval

let timeInterval: TimeInterval = 125.0
let tmv = timeval(tv_sec: Int(timeInterval), tv_usec: 0)
Duration(tmv)
    .formatted(.time(pattern: .hourMinuteSecond))  // "0:02:05"
Duration(tmv)
    .formatted(.time(pattern: .minuteSecond))      // "2:05"
Run Code Online (Sandbox Code Playgroud)

或者

Duration(
    secondsComponent: Int64(timeInterval),
    attosecondsComponent: 0
).formatted(.time(pattern: .minuteSecond))  // "2:05"
Run Code Online (Sandbox Code Playgroud)

您还可以使用其静态方法进行初始化:

let timeInterval: TimeInterval = 125.0
var duration: Duration = .seconds(timeInterval)
duration += .milliseconds(789)  // 125.789 seconds
    
duration.formatted(.time(pattern: .minuteSecond))  // "2:06"
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步定制:

duration.formatted(.time(pattern: .minuteSecond(padMinuteToLength: 2)))  // "02:06"
duration.formatted(.time(pattern: .minuteSecond(padMinuteToLength: 2, roundFractionalSeconds: .down)))  // "02:05"
duration.formatted(.time(pattern: .minuteSecond(padMinuteToLength: 2, fractionalSecondsLength: 3)))  // "02:05.789"
Run Code Online (Sandbox Code Playgroud)

  • 好发现!可惜现在是 iOS 16+,但仍然对此感到高兴。 (3认同)