Swift: conversión de números enteros a horas/minutos/segundos
Tengo una pregunta (¿algo?) básica sobre las conversiones de tiempo en Swift .
Tengo un número entero que me gustaría convertir en Horas/Minutos/Segundos.
Ejemplo: Int = 27005
me daría:
7 Hours 30 Minutes 5 Seconds
Sé cómo hacer esto en PHP, pero, por desgracia, Swift no es PHP.
Definir
func secondsToHoursMinutesSeconds(_ seconds: Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Usar
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
o
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
La función anterior utiliza tuplas Swift para devolver tres valores a la vez. Puede desestructurar la tupla usando la let (var, ...)
sintaxis o puede acceder a miembros individuales de la tupla, si es necesario.
Si realmente necesita imprimirlo con las palabras, Hours
etc., utilice algo como esto:
func printSecondsToHoursMinutesSeconds(_ seconds: Int) {
let (h, m, s) = secondsToHoursMinutesSeconds(seconds)
print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}
Tenga en cuenta que la implementación anterior de secondsToHoursMinutesSeconds()
trabajos para Int
argumentos. Si desea una Double
versión, deberá decidir cuáles son los valores de retorno: podría ser (Int, Int, Double)
o podría ser (Double, Double, Double)
. Podrías probar algo como:
func secondsToHoursMinutesSeconds(seconds: Double) -> (Double, Double, Double) {
let (hr, minf) = modf(seconds / 3600)
let (min, secf) = modf(60 * minf)
return (hr, min, 60 * secf)
}
En macOS 10.10+/iOS 8.0+ (NS)DateComponentsFormatter
se introdujo para crear una cadena legible.
Considera la configuración regional y el idioma del usuario.
let interval = 27005
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .full
let formattedString = formatter.string(from: TimeInterval(interval))!
print(formattedString)
Los estilos de unidad disponibles son positional
, abbreviated
, short
, full
y .spellOut
brief
Para más información por favor lea la documentación .
Sobre la base de la respuesta de Vadian , escribí una extensión que toma a Double
(de los cuales TimeInterval
es un alias de tipo) y escupe una cadena formateada como hora.
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) ?? ""
}
}
Así es como DateComponentsFormatter.UnitsStyle
se ven las distintas opciones:
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
En 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)
}
Para llamar a la función
timeString(time: TimeInterval(i))
Volverá 02:44:57