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
etc 라는 단어로 인쇄해야하는 경우 다음과 같이 사용하십시오.
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+ / iOS 8.0+ (NS)DateComponentsFormatter
에서는 읽을 수있는 문자열을 생성하기 위해 도입되었습니다.
사용자의 로케일과 언어를 고려합니다.
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
, spellOut
와 brief
.
자세한 내용은 문서 를 참조하십시오 .
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
순수하게 정수 기반 접근 방식은 윤일 / 초를 고려하지 않습니다. 사용 사례가 실제 날짜 / 시간을 다루는 경우 날짜 와 달력을 사용해야합니다.
스위프트 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)
}
Swift3의 또 다른 간단한 구현이 있습니다.
func seconds2Timestamp(intSeconds:Int)->String {
let mins:Int = intSeconds/60
let hours:Int = mins/60
let secs:Int = intSeconds%60
let strTimestamp:String = ((hours<10) ? "0" : "") + String(hours) + ":" + ((mins<10) ? "0" : "") + String(mins) + ":" + ((secs<10) ? "0" : "") + String(secs)
return strTimestamp
}
애플리케이션의 대상이 iOS 10.0 이상인 Measurement
경우 초 단위를 시간, 분 및 초로 변환하는 데 사용할 수 있습니다 . Swift 4.2.1 / Xcode 10.1에서이 함수를 사용하여 단위 기간 값을 초로 변환 할 수 있습니다.
func convert<MeasurementType: BinaryInteger>(measurementValue: MeasurementType,
unitDuration: UnitDuration) -> (MeasurementType, MeasurementType) {
let measurementSeconds = Measurement<UnitDuration>(value: Double(measurementValue),
unit: .seconds)
let secondsCount = MeasurementType(measurementSeconds.converted(to: unitDuration).value)
let measurementCurrentUnit = Measurement(value: Double(secondsCount),
unit: unitDuration)
let currentUnitCount = MeasurementType(measurementCurrentUnit.converted(to: .seconds).value)
return (secondsCount, measurementValue - currentUnitCount)
}
필요한 값을 얻으려면 두 번 호출하십시오.
func convertSecondsToHoursMinutesSeconds<MeasurementType: BinaryInteger>(seconds: MeasurementType) -> (MeasurementType, MeasurementType, MeasurementType) {
let hoursAndRestSeconds = convert(measurementValue: seconds, unitDuration: .hours)
let minutesAndRestSeconds = convert(measurementValue: hoursAndRestSeconds.1, unitDuration: .minutes)
return (hoursAndRestSeconds.0, minutesAndRestSeconds.0, minutesAndRestSeconds.1)
}
사용 방법:
let result = convertSecondsToHoursMinutesSeconds(seconds: 27005)
print("\(result.0) Hours \(result.1) Minutes \(result.2) Seconds")
보시다시피 내 솔루션에서 60, 3600 또는 기타 숫자 상수를 사용하지 않았습니다.
확장을 사용하는 위의 대략적인 기반의 SWIFT 3.0 솔루션.
extension CMTime {
var durationText:String {
let totalSeconds = CMTimeGetSeconds(self)
let hours:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 86400) / 3600)
let minutes:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 3600) / 60)
let seconds:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 60))
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
AVPlayer에서 이렇게 부르는 것과 함께 사용 하시겠습니까?
let dTotalSeconds = self.player.currentTime()
playingCurrentTime = dTotalSeconds.durationText
Swift 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을 반환 합니다.
GoZoner 답변 에 따르면 시간, 분 및 초에 따라 시간 형식을 지정 하기 위해 Extension을 작성했습니다 .
extension Double {
func secondsToHoursMinutesSeconds () -> (Int?, Int?, Int?) {
let hrs = self / 3600
let mins = (self.truncatingRemainder(dividingBy: 3600)) / 60
let seconds = (self.truncatingRemainder(dividingBy:3600)).truncatingRemainder(dividingBy:60)
return (Int(hrs) > 0 ? Int(hrs) : nil , Int(mins) > 0 ? Int(mins) : nil, Int(seconds) > 0 ? Int(seconds) : nil)
}
func printSecondsToHoursMinutesSeconds () -> String {
let time = self.secondsToHoursMinutesSeconds()
switch time {
case (nil, let x? , let y?):
return "\(x) min \(y) sec"
case (nil, let x?, nil):
return "\(x) min"
case (let x?, nil, nil):
return "\(x) hr"
case (nil, nil, let x?):
return "\(x) sec"
case (let x?, nil, let z?):
return "\(x) hr \(z) sec"
case (let x?, let y?, nil):
return "\(x) hr \(y) min"
case (let x?, let y?, let z?):
return "\(x) hr \(y) min \(z) sec"
default:
return "n/a"
}
}
}
let tmp = 3213123.printSecondsToHoursMinutesSeconds() // "892 hr 32 min 3 sec"
Here is what I use for my Music Player in Swift 4+. I am converting seconds Int to readable String format
extension Int {
var toAudioString: String {
let h = self / 3600
let m = (self % 3600) / 60
let s = (self % 3600) % 60
return h > 0 ? String(format: "%1d:%02d:%02d", h, m, s) : String(format: "%1d:%02d", m, s)
}
}
Use like this:
print(7903.toAudioString)
Output: 2:11:43
Answer of @r3dm4n was great. However, I needed also hour in it. Just in case someone else needed too here it is:
func formatSecondsToString(_ seconds: TimeInterval) -> String {
if seconds.isNaN {
return "00:00:00"
}
let sec = Int(seconds.truncatingRemainder(dividingBy: 60))
let min = Int(seconds.truncatingRemainder(dividingBy: 3600) / 60)
let hour = Int(seconds / 3600)
return String(format: "%02d:%02d:%02d", hour, min, sec)
}
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)
NSTimeInterval
is Double
do do it with extension. Example:
extension Double {
var formattedTime: String {
var formattedTime = "0:00"
if self > 0 {
let hours = Int(self / 3600)
let minutes = Int(truncatingRemainder(dividingBy: 3600) / 60)
formattedTime = String(hours) + ":" + (minutes < 10 ? "0" + String(minutes) : String(minutes))
}
return formattedTime
}
}
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.
Swift 4 I'm using this extension
extension Double {
func stringFromInterval() -> String {
let timeInterval = Int(self)
let millisecondsInt = Int((self.truncatingRemainder(dividingBy: 1)) * 1000)
let secondsInt = timeInterval % 60
let minutesInt = (timeInterval / 60) % 60
let hoursInt = (timeInterval / 3600) % 24
let daysInt = timeInterval / 86400
let milliseconds = "\(millisecondsInt)ms"
let seconds = "\(secondsInt)s" + " " + milliseconds
let minutes = "\(minutesInt)m" + " " + seconds
let hours = "\(hoursInt)h" + " " + minutes
let days = "\(daysInt)d" + " " + hours
if daysInt > 0 { return days }
if hoursInt > 0 { return hours }
if minutesInt > 0 { return minutes }
if secondsInt > 0 { return seconds }
if millisecondsInt > 0 { return milliseconds }
return ""
}
}
useage
// assume myTimeInterval = 96460.397
myTimeInteval.stringFromInterval() // 1d 2h 47m 40s 397ms
neek's answer isn't correct.
here's the correct version
func seconds2Timestamp(intSeconds:Int)->String {
let mins:Int = (intSeconds/60)%60
let hours:Int = intSeconds/3600
let secs:Int = intSeconds%60
let strTimestamp:String = ((hours<10) ? "0" : "") + String(hours) + ":" + ((mins<10) ? "0" : "") + String(mins) + ":" + ((secs<10) ? "0" : "") + String(secs)
return strTimestamp
}
Latest Code: XCode 10.4 Swift 5
extension Int {
func timeDisplay() -> String {
return "\(self / 3600):\((self % 3600) / 60):\((self % 3600) % 60)"
}
}
참고URL : https://stackoverflow.com/questions/26794703/swift-integer-conversion-to-hours-minutes-seconds
'Programming' 카테고리의 다른 글
단일 파일을 사용한 Python 로깅 (함수 이름, 파일 이름, 줄 번호) (0) | 2020.08.25 |
---|---|
JQuery $ .scrollTo () 함수를 사용하여 창을 스크롤하는 방법 (0) | 2020.08.25 |
ALAssetRepresentation에서 XMP 메타 데이터 해석 (0) | 2020.08.25 |
prefetchPlugin 및 분석 도구를 사용하여 웹팩의 빌드 시간을 최적화하는 방법은 무엇입니까? (0) | 2020.08.25 |
Xcode 7.3 자동 완성은 너무 실망 스럽습니다. (0) | 2020.08.25 |