从NSTimeInterval转换为swift中的小时,分​​钟,秒,毫秒

Lyd*_*dia 50 nstimeinterval ios swift

我的代码在这里:

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)
}
Run Code Online (Sandbox Code Playgroud)

在输出中毫秒给出错误的结果.请给出如何正确找到毫秒的想法.

Mat*_*uch 113

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

var ms = Int((interval % 1) * 1000)
Run Code Online (Sandbox Code Playgroud)

如:

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)
}
Run Code Online (Sandbox Code Playgroud)

结果:

stringFromTimeInterval(12345.67)                   "03:25:45.670"
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)

        }
    }
Run Code Online (Sandbox Code Playgroud)

使用:

self.timeLabel.text = player.duration.stringFromTimeInterval()
Run Code Online (Sandbox Code Playgroud)

  • '%' 不可用:对于浮点数,请使用 truncatingRemainder 代替 (2认同)

Jak*_*nin 24

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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经建议修改微积分的编辑.再次感谢您的回答! (3认同)
  • 杰克这可能是一个很好的答案,但微积分不是100%正确:| 3599返回-1s | 12601返回3h -29m 1s (2认同)

小智 17

基于@ matthias-bauch答案,在Objective-C中等效.

+ (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];
}
Run Code Online (Sandbox Code Playgroud)


小智 13

Swift 5。没有毫秒和一些条件格式(即,如果有 0 小时,则不显示小时)。

extension TimeInterval{

func stringFromTimeInterval() -> String {

    let time = NSInteger(self)

    let seconds = time % 60
    let minutes = (time / 60) % 60
    let hours = (time / 3600)

    var formatString = ""
    if hours == 0 {
        if(minutes < 10) {
            formatString = "%2d:%0.2d"
        }else {
            formatString = "%0.2d:%0.2d"
        }
        return String(format: formatString,minutes,seconds)
    }else {
        formatString = "%2d:%0.2d:%0.2d"
        return String(format: formatString,hours,minutes,seconds)
    }
}
}
Run Code Online (Sandbox Code Playgroud)


vad*_*ian 12

适用于iOS 8 +的swift 3解决方案,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"
Run Code Online (Sandbox Code Playgroud)

  • 如果你想显示零,请使用 formatter.zeroFormattingBehavior = .pad (2认同)

Moh*_*our 10

斯威夫特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)

        }
    }
Run Code Online (Sandbox Code Playgroud)

使用:

self.timeLabel.text = player.duration.stringFromTimeInterval()
Run Code Online (Sandbox Code Playgroud)


mir*_*rap 7

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)
}
Run Code Online (Sandbox Code Playgroud)


lil*_*pit 6

我认为大多数答案都已过时,如果要显示表示时间间隔的字符串,则应始终使用DateComponentsFormatter,因为它将为您处理填充和本地化。

  • 对于99%的情况而言,这是正确的。当需要“ DateComponentsFormatter”不支持的“ NSCalendar.Unit”时(例如,“。nanosecond”),那么使用这些方法之一将很有用。 (2认同)