Swift: conversión de números enteros a horas/minutos/segundos

Resuelto Joe asked hace 54 años • 25 respuestas

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.

Joe avatar Jan 01 '70 08:01 Joe
Aceptado

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, Hoursetc., 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 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)
}
GoZoner avatar Nov 07 '2014 05:11 GoZoner

En macOS 10.10+/iOS 8.0+ (NS)DateComponentsFormatterse 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, fully .spellOutbrief

Para más información por favor lea la documentación .

vadian avatar May 10 '2017 10:05 vadian

Sobre la base de la respuesta de Vadian , escribí una extensión que toma a Double(de los cuales TimeIntervales 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.UnitsStylese 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
Adrian avatar Mar 02 '2018 13:03 Adrian

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

DialDT avatar Jun 28 '2019 17:06 DialDT