我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
我有一个(有点?)关于Swift中的时间转换的基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例:Int = 27005会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中做到这一点,但是,唉,swift不是PHP。
当前回答
NSTimeInterval是Double,使用扩展。例子:
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
}
}
其他回答
最新代码:XCode 10.4 Swift 5
extension Int {
func timeDisplay() -> String {
return "\(self / 3600):\((self % 3600) / 60):\((self % 3600) % 60)"
}
}
基于Vadian的回答,我写了一个扩展,它接受Double(其中TimeInterval是类型别名),并输出一个格式化为时间的字符串。
extension Double {
func asString(style: DateComponentsFormatter.UnitsStyle) -> String {
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second, .nanosecond]
formatter.unitsStyle = style
return formatter.string(from: self) ?? ""
}
}
这里是各种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
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
}
根据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"
定义
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)
}