我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
当前回答
来自@Gamec的答案
typealias CallDuration = Int
extension CallDuration {
func formatedString() -> String? {
let hours = self / 3600
let minutes = (self / 60) % 60
let seconds = self % 60
if hours > 0 { return String(format: "%0.2d:%0.2d:%0.2d", hours, minutes, seconds) }
return String(format: "%0.2d:%0.2d", minutes, seconds)
}
}
用法:
let duration: CallDuration = 3000
duration.formatedString() // 50 minute
其他回答
来自@Gamec的答案
typealias CallDuration = Int
extension CallDuration {
func formatedString() -> String? {
let hours = self / 3600
let minutes = (self / 60) % 60
let seconds = self % 60
if hours > 0 { return String(format: "%0.2d:%0.2d:%0.2d", hours, minutes, seconds) }
return String(format: "%0.2d:%0.2d", minutes, seconds)
}
}
用法:
let duration: CallDuration = 3000
duration.formatedString() // 50 minute
在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)
可用的单元样式有位置型、简写型、短型、全型、拼字型和简写型。
欲了解更多信息,请阅读文档。
Swift 5 &字符串响应,在像样的格式
public static func secondsToHoursMinutesSecondsStr (seconds : Int) -> String {
let (hours, minutes, seconds) = secondsToHoursMinutesSeconds(seconds: seconds);
var str = hours > 0 ? "\(hours) h" : ""
str = minutes > 0 ? str + " \(minutes) min" : str
str = seconds > 0 ? str + " \(seconds) sec" : str
return str
}
public static func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
用法:
print(secondsToHoursMinutesSecondsStr(seconds: 20000)) // Result = "5 h 33 min 20 sec"
根据GoZoner的答案,我写了一个扩展,以获得时间格式化根据小时,分钟和秒:
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"
我已经构建了一个现有答案的mashup,以简化一切并减少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