DateComponentsFormatter

DateComponentsFormatter

我想将时间从几秒增加到位置格式,例如2:05 min或1:23 h或19 s。我在检索本地化的缩写时间单位时遇到问题。这是我的代码。

let secs: Double = 3801
let stopWatchFormatter = DateComponentsFormatter()
stopWatchFormatter.unitsStyle = .positional
stopWatchFormatter.maximumUnitCount = 2
stopWatchFormatter.allowedUnits = [.hour, .minute, .second]
print(stopWatchFormatter.string(from: secs)) // 1:03
stopWatchFormatter.unitsStyle = .short
print(stopWatchFormatter.string(from: secs)) // 1 hr, 3 min


如您所见,将3801秒格式化为1:03,这很好,但是我不知道DateComponentsFormatter是用小时还是用分钟等。
我可能会使用简单的MOD逻辑对其进行检查,但随后就很难进行本地化了。另请注意,如果将collapsesLargestUnit设置为false,则MOD解决方案一文不值。

最佳答案

DateComponentsFormatter不直接支持所需的格式,该格式本质上是位置格式,但最后显示的是短格式的第一个单位。

以下帮助程序功能将这两个单独的结果组合为所需的结果。这应该适用于任何语言环境,但是需要进行彻底的测试以确认这一点。

func formatStopWatchTime(seconds: Double) -> String {
    let stopWatchFormatter = DateComponentsFormatter()
    stopWatchFormatter.unitsStyle = .positional
    stopWatchFormatter.maximumUnitCount = 2
    stopWatchFormatter.allowedUnits = [.hour, .minute, .second]
    var pos = stopWatchFormatter.string(from: seconds)!

    // Work around a bug where some values return 3 units despite only requesting 2 units
    let parts = pos.components(separatedBy: CharacterSet.decimalDigits.inverted)
    if parts.count > 2 {
        let seps = pos.components(separatedBy: .decimalDigits).filter { !$0.isEmpty }
        pos = parts[0..<2].joined(separator: seps[0])
    }

    stopWatchFormatter.maximumUnitCount = 1
    stopWatchFormatter.unitsStyle = .short
    let unit = stopWatchFormatter.string(from: seconds)!

    // Replace the digits in the unit result with the pos result
    let res = unit.replacingOccurrences(of: "[\\d]+", with: pos, options: [.regularExpression])

    return res
}

print(formatStopWatchTime(seconds: 3801))


输出:


  1:03小时

关于ios - iOS DateComponentsFormatter-获取使用的单位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48230176/

10-09 04:51