我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
当前回答
Xcode 12.1。Swift 5
DateComponentsFormatter:创建字符串表示的格式化程序, 通过使用unitsStyle,你可以得到一个你想要的字符串,并提到allowedUnits。 例如:output for unitsStyle:: for 10000秒
满=“2小时46分49秒” 位置= "2:46:40" 缩写为"2h 46m 40s" 拼写= " 2小时46分40秒" 短=“2小时46分40秒” 简短= "2小时46分40秒"
使用方便:
let time = convertSecondsToHrMinuteSec(seconds: 10000)
func convertSecondsToHrMinuteSec(seconds:Int) -> String{
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .full
let formattedString = formatter.string(from:TimeInterval(seconds))!
print(formattedString)
return formattedString
}
其他回答
我正在使用这个扩展
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 ""
}
}
用途不同
// assume myTimeInterval = 96460.397
myTimeInteval.stringFromInterval() // 1d 2h 47m 40s 397ms
Xcode 12.1。Swift 5
DateComponentsFormatter:创建字符串表示的格式化程序, 通过使用unitsStyle,你可以得到一个你想要的字符串,并提到allowedUnits。 例如:output for unitsStyle:: for 10000秒
满=“2小时46分49秒” 位置= "2:46:40" 缩写为"2h 46m 40s" 拼写= " 2小时46分40秒" 短=“2小时46分40秒” 简短= "2小时46分40秒"
使用方便:
let time = convertSecondsToHrMinuteSec(seconds: 10000)
func convertSecondsToHrMinuteSec(seconds:Int) -> String{
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .full
let formattedString = formatter.string(from:TimeInterval(seconds))!
print(formattedString)
return formattedString
}
定义
func secondsToHoursMinutesSeconds(_ seconds: Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Use
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
or
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")
}
注意,上面的secondstohoursminutessecseconds()实现适用于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)
}
以下是我在Swift 4+中使用的音乐播放器。我将秒Int转换为可读的字符串格式
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)
}
}
像这样使用:
print(7903.toAudioString)
输出:2:11:43
我继续并为此创建了一个闭包(在Swift 3中)。
let (m, s) = { (secs: Int) -> (Int, Int) in
return ((secs % 3600) / 60, (secs % 3600) % 60) }(299)
这样m = 4 s = 59。你可以根据自己的喜好来设置格式。如果没有更多的信息,你当然也想增加工作时间。