conversion from NSTimeInterval to hour,minutes,seconds,milliseconds in swift

前端 未结 15 1334
不思量自难忘°
不思量自难忘° 2020-12-07 20:05

My code is here:

func stringFromTimeInterval(interval:NSTimeInterval) -> NSString {

    var ti = NSInteger(interval)
    var ms = ti * 1000
    var secon         


        
相关标签:
15条回答
  • 2020-12-07 20:39

    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()
    
    0 讨论(0)
  • 2020-12-07 20:41

    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.

    0 讨论(0)
  • 2020-12-07 20:46

    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
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题