Definir
func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Utilizar
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
o
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
La función anterior hace uso de las tuplas Swift para devolver tres valores a la vez. Puede desestructurar la tupla utilizando la let (var, ...)sintaxis o puede acceder a miembros individuales de la tupla, si es necesario.
Si realmente necesita imprimirlo con las palabras, Hoursetc., use 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 Intargumentos. Si desea una Doubleversió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)
}
(seconds % 3600) % 60puede optimizarse paraseconds % 60. No es necesario extraer las horas primero.printSecondstoHoursMinutesSeconds()no devuelve nada (vea el-> ()tipo de retorno en la declaración de función). La función imprime algo; que no aparece en un patio de juegos. Si desea que devuelva algo, diga a yStringluego elimine laprintln()llamada y arregle el tipo de retorno de la función.Inttipos debido a la naturaleza de las funciones/y%. Es decir,/cae la parte faccional. El mismo código no funcionaráDouble. Específicamente 2 == 13/5 pero 2.6 == 13.0 / 5. Por lo tanto, necesitaría una implementación diferente paraDouble. He actualizado mi respuesta con una nota sobre esto.En macOS 10.10+ / iOS 8.0+
(NS)DateComponentsFormatterse ha introducido para crear una cadena legible.Considera la configuración regional y el idioma del usuario.
Los estilos disponibles son unitarios
positional,abbreviated,short,full,spellOutybrief.Para obtener más información, lea la documentación .
fuente
formatter.unitsStyle = .positionalda exactamente lo que quiero (que es7:30:05)! Mejor respuesta OMIhours * 3600 + minutes * 60Sobre la base de la respuesta de Vadian , escribí una extensión que toma un
Double(de los cualesTimeIntervales un alias de tipo) y escupe una cadena con formato de tiempo.Estas son las diferentes
DateComponentsFormatter.UnitsStyleopciones:fuente
Doublesen Swift.formatter.zeroFormattingBehavior = .pad. Esto nos daría:3660.asString(style: .positional) // 01:01:00He creado una combinación de respuestas existentes para simplificar todo y reducir la cantidad de código necesario para Swift 3 .
Uso:
Huellas dactilares:
00:01:40fuente
Aquí hay un enfoque más estructurado / flexible: (Swift 3)
Tener un enfoque como este permite agregar un análisis de conveniencia como este:
Cabe señalar que los enfoques basados exclusivamente en enteros no tienen en cuenta los días bisiestos / segundos. Si el caso de uso se trata de fechas / horas reales, se debe usar Fecha y Calendario .
fuente
montha su implementación? ¡Gracias por adelantado!return number < 10 ? "0\(number)" : "\(number)"usando un formateador de cadenareturn String(format: "%02d", number)que agrega automáticamente un cero cuando el número está por debajo de 10En Swift 5:
Para llamar a la función
Volveremos 02:44:57
fuente
Swift 4
fuente
Aquí hay otra implementación simple en Swift3.
fuente
Solución SWIFT 3.0 basada aproximadamente en la anterior usando extensiones.
¿Usarlo con AVPlayer llamándolo así?
fuente
Respondí a una pregunta similar , sin embargo, no es necesario mostrar milisegundos en el resultado. Por lo tanto, mi solución requiere iOS 10.0, tvOS 10.0, watchOS 3.0 o macOS 10.12.
Debería llamar
func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:)por la respuesta que ya mencioné aquí:fuente
Swift 5:
Uso:
fuente
Según la respuesta de GoZoner , escribí una extensión para formatear el tiempo de acuerdo con las horas, minutos y segundos:
fuente
Esto es lo que uso para mi reproductor de música en Swift 4+. Estoy convirtiendo segundos Int a formato de cadena legible
Usar así:
Salida:
2:11:43fuente
La respuesta de @ r3dm4n fue genial. Sin embargo, también necesitaba una hora. En caso de que alguien más lo necesite también, aquí está:
fuente
Último código: XCode 10.4 Swift 5
fuente
Swift 5 & String Response, en formato presentable
Uso:
fuente
La forma más simple en mi humilde opinión:
fuente
ldpara doble en lugar dedint.NSTimeIntervalesDoublehacerlo con extensión. Ejemplo:fuente
Seguí adelante y creé un cierre para esto (en Swift 3).
Esto dará m = 4 ys = 59. Entonces puede formatearlo como desee. Por supuesto, es posible que desee agregar horas también, si no más información.
fuente
Swift 4 estoy usando esta extensión
uso
fuente
respuesta de Neek no es correcta.
aquí está la versión correcta
fuente
Otra forma sería convertir segundos a la fecha y tomar los componentes, es decir, segundos, minutos y horas desde la fecha misma. Esta solución tiene limitación solo hasta las 23:59:59
fuente