visual studio microsoft español descargar community ios swift

ios - studio - Swift-conversión entera a horas/minutos/segundos



visual studio installer (10)

Solución SWIFT 3.0 basada aproximadamente en la que se muestra arriba utilizando extensiones.

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) } } }

Úselo con AVPlayer llamándolo así?

let dTotalSeconds = self.player.currentTime() playingCurrentTime = dTotalSeconds.durationText

Tengo una (¿algo?) Pregunta básica sobre las conversiones temporales 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 desafortunadamente Swift no es PHP :-)

¡Cualquier consejo sobre cómo puedo lograr esto rápidamente sería fantástico! ¡Gracias de antemano!


Aquí hay otra implementación simple en 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 }


De acuerdo con la respuesta de GoZoner , he escrito una extensión para obtener el formato del tiempo según las horas, los minutos y los segundos:

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"


Seguí adelante y creé un cierre para esto (en Swift 3).

let (m, s) = { (secs: Int) -> (Int, Int) in return ((secs % 3600) / 60, (secs % 3600) % 60) }(299)

Esto dará m = 4 ys = 59. Así que puedes formatear eso como desees. Por supuesto, puede querer agregar horas también, si no más información.


La forma más simple de 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)


En macOS 10.10+ / iOS 8.0+ (NS)DateComponentsFormatter se ha introducido para crear una cadena legible.

Considera la configuración regional del usuario y el idioma.

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 , spellOut y brief .

Para obtener más información, lea la documentación .


NSTimeInterval es Double , hazlo con la extensión. Ejemplo:

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 } }


Creé una mezcla de respuestas existentes para simplificar todo y reducir la cantidad de código necesario para 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)" }

Uso:

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)") }

Huellas dactilares:

00:01:40


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 tuplas Swift para devolver tres valores a la vez. Usted desestructura la tupla usando la sintaxis let (var, ...) o puede acceder a miembros tuple individuales, 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() funciona para los argumentos Int . Si desea una versión Double , tendrá que 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) }


Aquí hay un enfoque más estructurado / flexible: (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)

Tener un enfoque como este permite agregar análisis de conveniencia como este:

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

Debe tenerse en cuenta que los enfoques basados ​​exclusivamente en Entero no tienen en cuenta día / segundo intercalar. Si el caso de uso trata con fechas / horas reales, se debe usar la fecha y el calendario .