[ios] Swift-시간 / 분 / 초로 정수 변환

Swift의 시간 변환에 관한 기본적인 질문이 있습니다.

시간 / 분 / 초로 변환하려는 정수가 있습니다.

예 : Int = 27005 나에게 줄 것이다 :

7 Hours  30 Minutes 5 Seconds

PHP 에서이 작업을 수행하는 방법을 알고 있지만 아쉽게도 swift는 PHP가 아닙니다 🙂

내가 이것을 신속하게 달성 할 수있는 방법에 대한 팁은 환상적입니다! 미리 감사드립니다!



답변

밝히다

func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
  return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}

사용하다

> secondsToHoursMinutesSeconds(27005)
(7,30,5)

또는

let (h,m,s) = secondsToHoursMinutesSeconds(27005)

위 함수는 Swift 튜플을 사용하여 한 번에 세 개의 값을 반환합니다. let (var, ...)구문을 사용하여 튜플을 구조화하거나 필요한 경우 개별 튜플 멤버에 액세스 할 수 있습니다.

실제로 단어 Hours등 으로 인쇄 해야하는 경우 다음과 같이 사용하십시오.

func printSecondsToHoursMinutesSeconds (seconds:Int) -> () {
  let (h, m, s) = secondsToHoursMinutesSeconds (seconds)
  print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}

참고 위의 구현이 secondsToHoursMinutesSeconds()를위한 일 Int인수. Double버전 을 원한다면 반환 값이 무엇인지 (Int, Int, Double)또는 결정해야 할지를 결정해야합니다 (Double, Double, Double). 당신은 다음과 같은 것을 시도 할 수 있습니다 :

func secondsToHoursMinutesSeconds (seconds : Double) -> (Double, Double, Double) {
  let (hr,  minf) = modf (seconds / 3600)
  let (min, secf) = modf (60 * minf)
  return (hr, min, 60 * secf)
}


답변

macOS 10.10+에서는 / (NS)DateComponentsFormatter읽을 수있는 문자열을 만들기 위해 iOS 8.0+ 가 도입되었습니다.

사용자의 로캘 및 언어를 고려합니다.

let interval = 27005

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .full

let formattedString = formatter.string(from: TimeInterval(interval))!
print(formattedString)

스타일이 가능한 장치 positional, abbreviated, short,full , spellOutbrief.

자세한 내용은 문서 를 참조하십시오 .


답변

Vadian의 대답바탕 으로 Double( TimeInterval타입 별칭 인) 확장을 작성하고 시간 형식의 문자열을 뱉어 냈습니다.

extension Double {
  func asString(style: DateComponentsFormatter.UnitsStyle) -> String {
    let formatter = DateComponentsFormatter()
    formatter.allowedUnits = [.hour, .minute, .second, .nanosecond]
    formatter.unitsStyle = style
    guard let formattedString = formatter.string(from: self) else { return "" }
    return formattedString
  }
}

다양한 DateComponentsFormatter.UnitsStyle옵션은 다음과 같습니다.

10000.asString(style: .positional)  // 2:46:40
10000.asString(style: .abbreviated) // 2h 46m 40s
10000.asString(style: .short)       // 2 hr, 46 min, 40 sec
10000.asString(style: .full)        // 2 hours, 46 minutes, 40 seconds
10000.asString(style: .spellOut)    // two hours, forty-six minutes, forty seconds
10000.asString(style: .brief)       // 2hr 46min 40sec


답변

모든 것을 단순화하고 Swift 3에 필요한 코드의 양을 줄이기 위해 기존 답변의 매시업을 만들었습니다 .

func hmsFrom(seconds: Int, completion: @escaping (_ hours: Int, _ minutes: Int, _ seconds: Int)->()) {

        completion(seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)

}

func getStringFrom(seconds: Int) -> String {

    return seconds < 10 ? "0\(seconds)" : "\(seconds)"
}

용법:

var seconds: Int = 100

hmsFrom(seconds: seconds) { hours, minutes, seconds in

    let hours = getStringFrom(seconds: hours)
    let minutes = getStringFrom(seconds: minutes)
    let seconds = getStringFrom(seconds: seconds)

    print("\(hours):\(minutes):\(seconds)")
}

인쇄물:

00:01:40


답변

보다 체계적이고 유연한 접근 방식은 다음과 같습니다. (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)

이와 같은 접근 방식을 사용하면 다음과 같은 편의 구문 분석을 추가 할 수 있습니다.

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

순전히 정수 기반 접근 방식은 윤일 / 초를 고려하지 않습니다. 유스 케이스가 실제 날짜 / 시간을 처리하는 경우 날짜달력을 사용해야합니다.


답변

스위프트 5에서 :

    var i = 9897

    func timeString(time: TimeInterval) -> String {
        let hour = Int(time) / 3600
        let minute = Int(time) / 60 % 60
        let second = Int(time) % 60

        // return formated string
        return String(format: "%02i:%02i:%02i", hour, minute, second)
    }

함수를 호출하려면

    timeString(time: TimeInterval(i))

02시 44 분 57 초를 반환 합니다


답변

스위프트 4

func formatSecondsToString(_ seconds: TimeInterval) -> String {
    if seconds.isNaN {
        return "00:00"
    }
    let Min = Int(seconds / 60)
    let Sec = Int(seconds.truncatingRemainder(dividingBy: 60))
    return String(format: "%02d:%02d", Min, Sec)
}