我对 Swift 中的时间转换有一个(有点?)基本问题。
我有一个整数,我想转换成小时/分钟/秒。
示例: Int = 27005
会给我:
7 Hours 30 Minutes 5 Seconds
我知道如何在PHP中执行此操作,但唉,swift不是PHP: - )
关于我如何在swift中实现这一目标的任何提示都会非常棒! 提前谢谢!
答案 0 :(得分:225)
定义
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)
}
答案 1 :(得分:123)
在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
。
有关详细信息,请阅读documenation。
答案 2 :(得分:26)
我已经构建了现有答案的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
答案 3 :(得分:20)
在Vadian's answer的基础上,我编写了一个扩展程序,其中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
答案 4 :(得分:14)
这是一种更有条理/更灵活的方法:( 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 :(得分:9)
Swift 4
import boto3
s3 = boto3.resource('s3')
bucket_name = 'bucketnamehere'
for bucket in s3.buckets.all():
print(bucket.name)
答案 6 :(得分:9)
这是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
}
答案 7 :(得分:5)
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
答案 8 :(得分:5)
如果应用程序的目标是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或其他数字常量。
答案 9 :(得分:3)
根据 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"
答案 10 :(得分:2)
Answer很不错。但是,我还需要一个小时。以防万一有人也需要它:
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)
}
答案 11 :(得分:2)
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"
答案 12 :(得分:1)
最简单的方式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)
答案 13 :(得分:1)
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
}
}
答案 14 :(得分:1)
在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
答案 15 :(得分:1)
extension Int {
func timeDisplay() -> String {
return "\(self / 3600):\((self % 3600) / 60):\((self % 3600) % 60)"
}
}
答案 16 :(得分:0)
我继续为此创建了一个闭包(在Swift 3中)。
let (m, s) = { (secs: Int) -> (Int, Int) in
return ((secs % 3600) / 60, (secs % 3600) % 60) }(299)
这将给出m = 4和s = 59.因此您可以根据需要格式化。如果没有更多信息,您当然也可以添加小时数。
答案 17 :(得分:0)
Swift 4我使用此扩展程序
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
答案 18 :(得分:0)
以下是我在Swift 4+中使用音乐播放器的内容。我将秒 Int 转换为可读的 String 格式
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
答案 19 :(得分:0)
neek's answer不正确。
这是正确的版本
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
}
答案 20 :(得分:0)
另一种方法是将秒转换为日期,并从日期本身获取秒,分钟和小时。 此解决方案仅限于23:59:59
答案 21 :(得分:0)
将数字转换为字符串形式的时间
func convertToHMS(number: Int) -> String {
let hour = number / 3600;
let minute = (number % 3600) / 60;
let second = (number % 3600) % 60 ;
var h = String(hour);
var m = String(minute);
var s = String(second);
if h.count == 1{
h = "0\(hour)";
}
if m.count == 1{
m = "0\(minute)";
}
if s.count == 1{
s = "0\(second)";
}
return "\(h):\(m):\(s)"
}
print(convertToHMS(number:3900))