Swift DateComponentsFormatter 删除前导零,但在分钟位置保留至少一位数字

2024-01-10

我在 Swift 中使用以下 DateComponentsFormatter:

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

这会产生类似 2:41(2 分 41 秒)和 08(8 秒)的结果。但是,我希望在“分钟”位置保留至少一位数字,返回 0:08 而不是 08。使用 DateComponentsFormatter 可以吗?我更喜欢返回本地化结果的解决方案。


是的。这可以通过在设置日期组件格式化程序允许的单位时添加基于时间间隔的三元条件来轻松完成:


Xcode 11 • Swift 5.1

extension Formatter {
    static let positional: DateComponentsFormatter = {
        let positional = DateComponentsFormatter()
        positional.unitsStyle = .positional
        positional.zeroFormattingBehavior = .pad
        return positional
    }()
}

extension TimeInterval {
    var positionalTime: String {
        Formatter.positional.allowedUnits = self >= 3600 ?
                                            [.hour, .minute, .second] :
                                            [.minute, .second]
        let string = Formatter.positional.string(from: self)!
        return string.hasPrefix("0") && string.count > 4 ?
            .init(string.dropFirst()) : string
    }
}

Usage

8.0.positionalTime     //    "0:08"
161.0.positionalTime   //    "2:41"
3600.0.positionalTime  // "1:00:00"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift DateComponentsFormatter 删除前导零,但在分钟位置保留至少一位数字 的相关文章

随机推荐