My code is here:
func stringFromTimeInterval(interval:NSTimeInterval) -> NSString {
var ti = NSInteger(interval)
var ms = ti * 1000
var secon
Swift supports remainder calculations on floating-point numbers, so we can use % 1
.
var ms = Int((interval % 1) * 1000)
as in:
func stringFromTimeInterval(interval: TimeInterval) -> NSString {
let ti = NSInteger(interval)
let ms = Int((interval % 1) * 1000)
let seconds = ti % 60
let minutes = (ti / 60) % 60
let hours = (ti / 3600)
return NSString(format: "%0.2d:%0.2d:%0.2d.%0.3d",hours,minutes,seconds,ms)
}
result:
stringFromTimeInterval(12345.67) "03:25:45.670"
Swift 4:
extension TimeInterval{
func stringFromTimeInterval() -> String {
let time = NSInteger(self)
let ms = Int((self.truncatingRemainder(dividingBy: 1)) * 1000)
let seconds = time % 60
let minutes = (time / 60) % 60
let hours = (time / 3600)
return String(format: "%0.2d:%0.2d:%0.2d.%0.3d",hours,minutes,seconds,ms)
}
}
Use:
self.timeLabel.text = player.duration.stringFromTimeInterval()
I think most of those answers are outdated, you should always use DateComponentsFormatter if you want to display a string representing a time interval, because it will handle padding and localization for you.
swift 3 version of @hixField answer, now with days and handling previous dates:
extension TimeInterval {
func timeIntervalAsString(_ format : String = "dd days, hh hours, mm minutes, ss seconds, sss ms") -> String {
var asInt = NSInteger(self)
let ago = (asInt < 0)
if (ago) {
asInt = -asInt
}
let ms = Int(self.truncatingRemainder(dividingBy: 1) * (ago ? -1000 : 1000))
let s = asInt % 60
let m = (asInt / 60) % 60
let h = ((asInt / 3600))%24
let d = (asInt / 86400)
var value = format
value = value.replacingOccurrences(of: "hh", with: String(format: "%0.2d", h))
value = value.replacingOccurrences(of: "mm", with: String(format: "%0.2d", m))
value = value.replacingOccurrences(of: "sss", with: String(format: "%0.3d", ms))
value = value.replacingOccurrences(of: "ss", with: String(format: "%0.2d", s))
value = value.replacingOccurrences(of: "dd", with: String(format: "%d", d))
if (ago) {
value += " ago"
}
return value
}
}