如何在Swift中将TimeInterval转换为分钟、秒和毫秒

13
我正在编写一款赛车应用程序,并想将大量的毫秒转换为分钟:秒.毫秒格式(例如,1:32.361)。目前我使用数学方法来实现这个功能(分钟/60000),然后获取余数并进一步除以得到秒和毫秒部分,但是我发现有时会误差1毫秒。我知道这可能听起来不像什么大不了的事情,但我尝试找到1:32.0041:32.004的平均值,结果返回了1:32.003,这意味着数据被不正确地处理了,导致应用程序无法处理。
是否有一种使用NSDateNSDateFormatter等工具将毫秒格式化为MM:ss.mmm的方法?
我查看了以下资源,但没有找到答案: How to convert milliseconds into minutes? Convert seconds into minutes and seconds Convert milliseconds to minutes http://www.codingexplorer.com/swiftly-getting-human-readable-date-nsdateformatter/

如果没有看到你的代码,很难判断为什么会偶尔出现不精确的结果......毫秒是如何表示的(作为整数或浮点数)? 你如何进行转换? 如何计算平均值? - Martin R
我有一个类似的问题,并且我发现DateComponentsFormatter不支持格式化毫秒,这对我来说似乎相当奇怪(也不允许任意零填充)。这可能对有类似问题的人有用。 - Gavin
1个回答

46
你可以创建一个 TimeInterval 扩展来格式化已经流逝的时间,如下所示:

Xcode 11.4 • Swift 5.2或更高版本

extension TimeInterval {
    var hourMinuteSecondMS: String {
        String(format:"%d:%02d:%02d.%03d", hour, minute, second, millisecond)
    }
    var minuteSecondMS: String {
        String(format:"%d:%02d.%03d", minute, second, millisecond)
    }
    var hour: Int {
        Int((self/3600).truncatingRemainder(dividingBy: 3600))
    }
    var minute: Int {
        Int((self/60).truncatingRemainder(dividingBy: 60))
    }
    var second: Int {
        Int(truncatingRemainder(dividingBy: 60))
    }
    var millisecond: Int {
        Int((self*1000).truncatingRemainder(dividingBy: 1000))
    }
}

extension Int {
    var msToSeconds: Double { Double(self) / 1000 }
}

let seconds = 131.531   // 131.531
let time = seconds.minuteSecondMS  //  "2:11.531"
let millisecond = seconds.millisecond    // 531

let ms = 1111
let sec = ms.msToSeconds.minuteSecondMS   // "0:01.111"

Date().description(with: .current)        // "Wednesday, October 21, 2020 at 5:44:51 PM Brasilia Standard Time"
let startOfDay = Calendar.current.startOfDay(for: Date())
let secondsFromStartOfDay = Date().timeIntervalSinceReferenceDate - startOfDay.timeIntervalSinceReferenceDate
secondsFromStartOfDay.hourMinuteSecondMS  // "17:44:51.705"

如果有小时,则应显示它,如果没有,则跳过它。 - user25
1
@user25的问题特别涉及到分钟、秒和毫秒。您可以根据自己的需求调整代码。 - Leo Dabus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接