Swift - Integer conversion to Hours/Minutes/Seconds

后端 未结 23 1136
無奈伤痛
無奈伤痛 2020-11-28 01:47

I have a (somewhat?) basic question regarding time conversions in Swift.

I have an integer that I would like converted into Hours / Minutes / Second

相关标签:
23条回答
  • 2020-11-28 02:20

    Here is a more structured/flexible approach: (Swift 3)

    struct StopWatch {
    
        var totalSeconds: Int
    
        var years: Int {
            return totalSeconds / 31536000
        }
    
        var days: Int {
            return (totalSeconds % 31536000) / 86400
        }
    
        var hours: Int {
            return (totalSeconds % 86400) / 3600
        }
    
        var minutes: Int {
            return (totalSeconds % 3600) / 60
        }
    
        var seconds: Int {
            return totalSeconds % 60
        }
    
        //simplified to what OP wanted
        var hoursMinutesAndSeconds: (hours: Int, minutes: Int, seconds: Int) {
            return (hours, minutes, seconds)
        }
    }
    
    let watch = StopWatch(totalSeconds: 27005 + 31536000 + 86400)
    print(watch.years) // Prints 1
    print(watch.days) // Prints 1
    print(watch.hours) // Prints 7
    print(watch.minutes) // Prints 30
    print(watch.seconds) // Prints 5
    print(watch.hoursMinutesAndSeconds) // Prints (7, 30, 5)
    

    Having an approach like this allows the adding of convenience parsing like this:

    extension StopWatch {
    
        var simpleTimeString: String {
            let hoursText = timeText(from: hours)
            let minutesText = timeText(from: minutes)
            let secondsText = timeText(from: seconds)
            return "\(hoursText):\(minutesText):\(secondsText)"
        }
    
        private func timeText(from number: Int) -> String {
            return number < 10 ? "0\(number)" : "\(number)"
        }
    }
    print(watch.simpleTimeString) // Prints 07:30:05
    

    It should be noted that purely Integer based approaches don't take leap day/seconds into account. If the use case is dealing with real dates/times Date and Calendar should be used.

    0 讨论(0)
  • 2020-11-28 02:20

    I had answered to the similar question, however you don't need to display milliseconds in the result. Hence my solution requires iOS 10.0, tvOS 10.0, watchOS 3.0 or macOS 10.12.

    You should call func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:) from the answer that I already mentioned here:

    let secondsToConvert = 27005
    let result: [Int] = convertDurationUnitValueToOtherUnits(
        durationValue: Double(secondsToConvert),
        durationUnit: .seconds,
        smallestUnitDuration: .seconds
    )
    print("\(result[0]) hours, \(result[1]) minutes, \(result[2]) seconds") // 7 hours, 30 minutes, 5 seconds
    
    0 讨论(0)
  • 2020-11-28 02:21

    The simplest way imho:

    let hours = time / 3600
    let minutes = (time / 60) % 60
    let seconds = time % 60
    return String(format: "%0.2d:%0.2d:%0.2d", hours, minutes, seconds)
    
    0 讨论(0)
  • 2020-11-28 02:21

    I went ahead and created a closure for this (in Swift 3).

    let (m, s) = { (secs: Int) -> (Int, Int) in
            return ((secs % 3600) / 60, (secs % 3600) % 60) }(299)
    

    This will give m = 4 and s = 59. So you can format that as you wish. You may of course want to add hours as well, if not more information.

    0 讨论(0)
  • 2020-11-28 02:21

    convert a number into time as a string

    func convertToHMS(number: Int) -> String {
      let hour    = number / 3600;
      let minute  = (number % 3600) / 60;
      let second = (number % 3600) % 60 ;
      
      var h = String(hour);
      var m = String(minute);
      var s = String(second);
      
      if h.count == 1{
          h = "0\(hour)";
      }
      if m.count == 1{
          m = "0\(minute)";
      }
      if s.count == 1{
          s = "0\(second)";
      }
      
      return "\(h):\(m):\(s)"
    }
    print(convertToHMS(number:3900))
    
    0 讨论(0)
提交回复
热议问题