从NSTimeInterval转换为小时,分钟,秒,毫秒在迅速

我的代码在这里:

func stringFromTimeInterval(interval:NSTimeInterval) -> NSString { var ti = NSInteger(interval) var ms = ti * 1000 var seconds = ti % 60 var minutes = (ti / 60) % 60 var hours = (ti / 3600) return NSString(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds,ms) } 

在输出中的毫秒数给出错误的结果。请给出一个想法如何正确地find毫秒。

Swift支持浮点数的余数计算,所以我们可以使用% 1

 var ms = Int((interval % 1) * 1000) 

如下所示:

 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) } 

结果:

 stringFromTimeInterval(12345.67) "03:25:45.670" 

Objective-C中的等价物,基于@ matthias-bauch答案。

 + (NSString *)stringFromTimeInterval:(NSTimeInterval)timeInterval { NSInteger interval = timeInterval; NSInteger ms = (fmod(timeInterval, 1) * 1000); long seconds = interval % 60; long minutes = (interval / 60) % 60; long hours = (interval / 3600); return [NSString stringWithFormat:@"%0.2ld:%0.2ld:%0.2ld,%0.3ld", hours, minutes, seconds, (long)ms]; } 

SWIFT 3扩展

我想这种方式更容易看到每件作品的来源,所以你可以更容易地修改它,以满足您的需求

 extension TimeInterval { private var milliseconds: Int { return Int((truncatingRemainder(dividingBy: 1)) * 1000) } private var seconds: Int { return Int(self) % 60 } private var minutes: Int { return (Int(self) / 60 ) % 60 } private var hours: Int { return Int(self) / 3600 } var stringTime: String { if hours != 0 { return "\(hours)h \(minutes)m \(seconds)s" } else if minutes != 0 { return "\(minutes)m \(seconds)s" } else if milliseconds != 0 { return "\(seconds)s \(milliseconds)ms" } else { return "\(seconds)s" } } } 

适用于iOS 8 +的Swift 3解决scheme,macOS 10.10+,如果零小时填充无关紧要:

 func stringFromTime(interval: TimeInterval) -> String { let ms = Int(interval.truncatingRemainder(dividingBy: 1) * 1000) let formatter = DateComponentsFormatter() formatter.allowedUnits = [.hour, .minute, .second] return formatter.string(from: interval)! + ".\(ms)" } print(stringFromTime(interval: 12345.67)) // "3:25:45.670" 

swift 3 @hixField版本的答案,现在用天和处理以前的date:

 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 } } 

Swift 4,不使用.remainder (它返回错误的值):

 func stringFromTimeInterval(interval: Double) -> NSString { let hours = (Int(interval) / 3600) let minutes = Int(interval / 60) - Int(hours * 60) let seconds = Int(interval) - (Int(interval / 60) * 60) return NSString(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds) } 

在swift 2.0中将小时和分钟转换为秒:

 ///RETORNA TOTAL DE SEGUNDOS DE HORA:MINUTOS func horasMinutosToSeconds (HoraMinutos:String) -> Int { let formatar = NSDateFormatter() let calendar = NSCalendar.currentCalendar() formatar.locale = NSLocale.currentLocale() formatar.dateFormat = "HH:mm" let Inicio = formatar.dateFromString(HoraMinutos) let comp = calendar.components([NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: Inicio!) let hora = comp.hour let minute = comp.minute let hours = hora*3600 let minuts = minute*60 let totseconds = hours+minuts return totseconds } 

转换成swift 2扩展+可变格式:

 extension NSTimeInterval { func timeIntervalAsString(format format : String = "hh:mm:ss:sss") -> String { let ms = Int((self % 1) * 1000) let asInt = NSInteger(self) let s = asInt % 60 let m = (asInt / 60) % 60 let h = (asInt / 3600) var value = format value = value.replace("hh", replacement: String(format: "%0.2d", h)) value = value.replace("mm", replacement: String(format: "%0.2d", m)) value = value.replace("sss", replacement: String(format: "%0.3d", ms)) value = value.replace("ss", replacement: String(format: "%0.2d", s)) return value } } extension String { /** Replaces all occurances from string with replacement */ public func replace(string:String, replacement:String) -> String { return self.stringByReplacingOccurrencesOfString(string, withString: replacement, options: NSStringCompareOptions.LiteralSearch, range: nil) } }