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, Hours
etc., 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 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)
}
(seconds % 3600) % 60
puede 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 yString
luego elimine laprintln()
llamada y arregle el tipo de retorno de la función.Int
tipos 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)DateComponentsFormatter
se 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
,spellOut
ybrief
.Para obtener más información, lea la documentación .
fuente
formatter.unitsStyle = .positional
da exactamente lo que quiero (que es7:30:05
)! Mejor respuesta OMIhours * 3600 + minutes * 60
Sobre la base de la respuesta de Vadian , escribí una extensión que toma un
Double
(de los cualesTimeInterval
es un alias de tipo) y escupe una cadena con formato de tiempo.Estas son las diferentes
DateComponentsFormatter.UnitsStyle
opciones:fuente
Doubles
en Swift.formatter.zeroFormattingBehavior = .pad
. Esto nos daría:3660.asString(style: .positional) // 01:01:00
He 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:40
fuente
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
month
a 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:43
fuente
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
ld
para doble en lugar ded
int.NSTimeInterval
esDouble
hacerlo 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