Définir
func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Utilisation
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
ou
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
La fonction ci-dessus utilise des tuples Swift pour renvoyer trois valeurs à la fois. Vous déstructurez le tuple en utilisant lelet (var, ...)
syntaxe ou pouvez accéder à des membres de tuple individuels, si nécessaire.
Si vous avez réellement besoin de l'imprimer avec les mots, Hours
etc., utilisez quelque chose comme ceci:
func printSecondsToHoursMinutesSeconds (seconds:Int) -> () {
let (h, m, s) = secondsToHoursMinutesSeconds (seconds)
print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}
Notez que l'implémentation ci-dessus secondsToHoursMinutesSeconds()
fonctionne pour les Int
arguments. Si vous voulez une Double
version, vous devrez décider quelles sont les valeurs de retour - pourraient être (Int, Int, Double)
ou pourraient être (Double, Double, Double)
. Vous pouvez essayer quelque chose comme:
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
peut être optimisée àseconds % 60
. Pas besoin d'extraire d'abord les heures.printSecondstoHoursMinutesSeconds()
ne renvoie rien (voir le-> ()
type de retour dans la déclaration de fonction). La fonction imprime quelque chose; qui n'apparaît pas dans un Playground. Si vous voulez qu'il renvoie quelque chose, dites a,String
puis éliminez l'println()
appel et corrigez le type de retour de la fonction.Int
types en raison de la nature des fonctions/
et%
. Cela/
laisse tomber la partie factionnelle. Le même code ne fonctionnera pasDouble
. Plus précisément 2 == 13/5 mais 2,6 == 13,0 / 5. Par conséquent, vous auriez besoin d'une implémentation différente pourDouble
. J'ai mis à jour ma réponse avec une note à ce sujet.Dans macOS 10.10+ / iOS 8.0+
(NS)DateComponentsFormatter
a été introduit pour créer une chaîne lisible.Il prend en compte les paramètres régionaux et la langue de l'utilisateur.
Les styles d'unités disponibles sont
positional
,abbreviated
,short
,full
,spellOut
etbrief
.Pour plus d'informations, veuillez lire la documentation .
la source
formatter.unitsStyle = .positional
donne exactement ce que je veux (ce qui est7:30:05
)! Meilleure réponse IMOhours * 3600 + minutes * 60
En me basant sur la réponse de Vadian , j'ai écrit une extension qui prend un
Double
(dontTimeInterval
est un alias de type) et crache une chaîne formatée en temps.Voici à quoi ressemblent les différentes
DateComponentsFormatter.UnitsStyle
options:la source
Doubles
dans Swift.formatter.zeroFormattingBehavior = .pad
. Cela nous donnerait:3660.asString(style: .positional) // 01:01:00
J'ai construit un mashup de réponses existantes pour tout simplifier et réduire la quantité de code nécessaire pour Swift 3 .
Usage:
Impressions:
00:01:40
la source
Voici une approche plus structurée / flexible: (Swift 3)
Avoir une approche comme celle-ci permet d'ajouter une analyse pratique comme celle-ci:
Il convient de noter que les approches purement basées sur des nombres entiers ne prennent pas en compte les jours / secondes bissextiles. Si le cas d'utilisation traite avec les dates / heures réel La date et le calendrier devrait être utilisé.
la source
month
à votre mise en œuvre? Merci d'avance!return number < 10 ? "0\(number)" : "\(number)"
en utilisant un formateur de chaînereturn String(format: "%02d", number)
qui ajoute automatiquement un zéro lorsque le nombre est inférieur à 10Dans Swift 5:
Pour appeler la fonction
Reviendra 02:44:57
la source
Swift 4
la source
Voici une autre implémentation simple dans Swift3.
la source
Solution SWIFT 3.0 basée à peu près sur celle ci-dessus en utilisant des extensions.
Utilisez-le avec AVPlayer en l'appelant comme ça?
la source
J'avais répondu à la question similaire , mais vous n'avez pas besoin d'afficher les millisecondes dans le résultat. Par conséquent, ma solution nécessite iOS 10.0, tvOS 10.0, watchOS 3.0 ou macOS 10.12.
Vous devriez appeler à
func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:)
partir de la réponse que j'ai déjà mentionnée ici:la source
Swift 5:
Usage:
la source
Selon la réponse de GoZoner, j'ai écrit une extension pour que l' heure soit formatée en fonction des heures, des minutes et des secondes:
la source
Voici ce que j'utilise pour mon lecteur de musique dans Swift 4+. Je convertis les secondes Int en format String lisible
Utilisez comme ceci:
Production:
2:11:43
la source
La réponse de @ r3dm4n était géniale. Cependant, il me fallait aussi une heure. Juste au cas où quelqu'un d'autre en aurait besoin, voici:
la source
Dernier code: XCode 10.4 Swift 5
la source
Swift 5 & String Response, au format présentable
Usage:
la source
Le moyen le plus simple à mon humble avis:
la source
ld
pour double au lieu ded
pour int.NSTimeInterval
estDouble
le faire avec l'extension. Exemple:la source
Je suis allé de l'avant et j'ai créé une fermeture pour cela (dans Swift 3).
Cela donnera m = 4 et s = 59. Vous pouvez donc formater cela comme vous le souhaitez. Vous pouvez bien sûr ajouter des heures, sinon plus d'informations.
la source
Swift 4 J'utilise cette extension
utilisation
la source
réponse de neek n'est pas correcte.
voici la bonne version
la source
Une autre façon serait de convertir les secondes en date et de prendre les composants, c'est-à-dire les secondes, les minutes et les heures à partir de la date elle-même. Cette solution est limitée jusqu'à 23:59:59
la source