Definieren
func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) {
return (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
}
Verwenden
> secondsToHoursMinutesSeconds(27005)
(7,30,5)
oder
let (h,m,s) = secondsToHoursMinutesSeconds(27005)
Die obige Funktion verwendet Swift-Tupel, um drei Werte gleichzeitig zurückzugeben. Sie zerstören das Tupel mithilfe der let (var, ...)
Syntax oder können bei Bedarf auf einzelne Tupelelemente zugreifen.
Wenn Sie es tatsächlich mit den Worten ausdrucken müssen Hours
usw. Folgendes:
func printSecondsToHoursMinutesSeconds (seconds:Int) -> () {
let (h, m, s) = secondsToHoursMinutesSeconds (seconds)
print ("\(h) Hours, \(m) Minutes, \(s) Seconds")
}
Beachten Sie, dass die obige Implementierung von Argumenten secondsToHoursMinutesSeconds()
funktioniert Int
. Wenn Sie eine Double
Version wünschen, müssen Sie entscheiden, wie die Rückgabewerte lauten - könnten (Int, Int, Double)
oder könnten (Double, Double, Double)
. Sie könnten etwas versuchen wie:
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
kann auf optimiert werdenseconds % 60
. Sie müssen die Stunden nicht zuerst extrahieren.printSecondstoHoursMinutesSeconds()
gibt nichts zurück (siehe den-> ()
Rückgabetyp in der Funktionsdeklaration). Die Funktion druckt etwas; die nicht auf einem Spielplatz angezeigt wird. Wenn Sie möchten, dass etwas zurückgegeben wird, sagen Sie a,String
entfernen Sie denprintln()
Aufruf und korrigieren Sie den Rückgabetyp der Funktion.Int
aufgrund der Art der/
und%
Funktionen für Typen . Das/
lässt den Fraktionsteil fallen. Der gleiche Code funktioniert nicht fürDouble
. Insbesondere 2 == 13/5, aber 2,6 == 13,0 / 5. Daher benötigen Sie eine andere Implementierung fürDouble
. Ich habe meine Antwort mit einem Hinweis dazu aktualisiert.In macOS 10.10+ / iOS 8.0+
(NS)DateComponentsFormatter
wurde eine lesbare Zeichenfolge erstellt.Es berücksichtigt das Gebietsschema und die Sprache des Benutzers.
Die zur Verfügung stehende Einheit Stile sind
positional
,abbreviated
,short
,full
,spellOut
undbrief
.Weitere Informationen finden Sie in der Dokumentation .
quelle
formatter.unitsStyle = .positional
gibt genau das, was ich will (was ist7:30:05
)! Beste Antwort IMOhours * 3600 + minutes * 60
Aufbauend auf Vadians Antwort habe ich eine Erweiterung geschrieben, die ein
Double
(von demTimeInterval
ein Typ-Alias ist) verwendet und eine als Zeit formatierte Zeichenfolge ausspuckt.So sehen die verschiedenen
DateComponentsFormatter.UnitsStyle
Optionen aus:quelle
Doubles
in Swift dargestellt.formatter.zeroFormattingBehavior = .pad
. Dies würde uns geben:3660.asString(style: .positional) // 01:01:00
Ich habe ein Mashup vorhandener Antworten erstellt, um alles zu vereinfachen und die für Swift 3 benötigte Codemenge zu reduzieren .
Verwendung:
Drucke:
00:01:40
quelle
Hier ist ein strukturierterer / flexiblerer Ansatz: (Swift 3)
Ein solcher Ansatz ermöglicht das Hinzufügen von Convenience-Parsing wie folgt:
Es sollte beachtet werden, dass rein ganzzahlige Ansätze Schalttage / Sekunden nicht berücksichtigen. Wenn es sich bei dem Anwendungsfall um reale Daten / Zeiten handelt, sollten Datum und Kalender verwendet werden.
quelle
month
Ihre Implementierung ergänzen ? Danke im Voraus!return number < 10 ? "0\(number)" : "\(number)"
durch einen Zeichenfolgenformatierer ersetzen ,return String(format: "%02d", number)
der automatisch eine Null hinzufügt, wenn die Zahl unter 10 liegtIn Swift 5:
Funktion aufrufen
Kommt zurück 02:44:57
quelle
Swift 4
quelle
Hier ist eine weitere einfache Implementierung in Swift3.
quelle
SWIFT 3.0-Lösung, die ungefähr auf der oben genannten basiert und Erweiterungen verwendet.
Verwenden Sie es mit AVPlayer, der es so nennt?
quelle
Ich hatte auf die ähnliche Frage geantwortet , Sie müssen jedoch keine Millisekunden im Ergebnis anzeigen. Daher erfordert meine Lösung iOS 10.0, tvOS 10.0, watchOS 3.0 oder macOS 10.12.
Sie sollten
func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:)
von der Antwort anrufen , die ich hier bereits erwähnt habe:quelle
Swift 5:
Verwendung:
quelle
Laut GoZoner- Antwort habe ich eine Erweiterung geschrieben, um die Zeit nach Stunden, Minuten und Sekunden zu formatieren :
quelle
Folgendes verwende ich für meinen Musik-Player in Swift 4+. Ich konvertiere Sekunden Int in lesbares String- Format
Verwenden Sie wie folgt:
Ausgabe:
2:11:43
quelle
Die Antwort von @ r3dm4n war großartig. Allerdings brauchte ich auch eine Stunde drin. Nur für den Fall, dass hier auch jemand anderes benötigt wird:
quelle
Letzter Code: XCode 10.4 Swift 5
quelle
Swift 5 & String Response, In vorzeigbarem Format
Verwendung:
quelle
Der einfachste Weg imho:
quelle
ld
für double stattd
für int sein.NSTimeInterval
istDouble
zu tun es mit der Erweiterung. Beispiel:quelle
Ich habe einen Abschluss dafür erstellt (in Swift 3).
Dies ergibt m = 4 und s = 59. Sie können das also nach Ihren Wünschen formatieren. Natürlich möchten Sie natürlich auch Stunden hinzufügen, wenn nicht mehr Informationen.
quelle
Swift 4 Ich benutze diese Erweiterung
Verwendung
quelle
neeks antwort ist nicht richtig.
Hier ist die richtige Version
quelle
Eine andere Möglichkeit wäre, Sekunden in Datum umzuwandeln und die Komponenten, dh Sekunden, Minuten und Stunden, vom Datum selbst zu übernehmen. Diese Lösung ist nur bis 23:59:59 begrenzt
quelle