Sekunden-Ganzzahl in HH konvertieren: MM, iPhone


68

Ich kämpfe damit. Ich habe einen Wert in Sekunden, den ich in einem Etikett im HH: MM-Format anzeigen möchte. Ich habe lange im Internet gesucht und einige Antworten gefunden, aber entweder nicht vollständig verstanden, oder sie scheinen eine seltsame Art zu sein, das zu tun, was ich will. Wenn mir jemand dabei helfen könnte, wäre das großartig! Denken Sie daran, dass ich neu in diesen Spielen bin, so dass diese Frage für die erfahreneren da draußen wie eine wirklich grundlegende Frage erscheinen kann.


Schauen Sie sich eine ähnliche Frage an, die ich vor einiger Zeit gestellt habe und die auch den Aspekt des Gedächtnisses und der Effizienz abdeckt.
Jorge Israel Peña

Antworten:


249

Ich habe nach dem gesucht, was Sie suchen, konnte aber keines finden. Also schrieb ich eine -

- (NSString *)timeFormatted:(int)totalSeconds
{

    int seconds = totalSeconds % 60; 
    int minutes = (totalSeconds / 60) % 60; 
    int hours = totalSeconds / 3600; 

    return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; 
}

funktioniert auch in Swift perfekt :

 func timeFormatted(totalSeconds: Int) -> String {
    let seconds: Int = totalSeconds % 60
    let minutes: Int = (totalSeconds / 60) % 60
    let hours: Int = totalSeconds / 3600
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
 }

Vielen Dank für Ihre Antwort, es sieht aus wie das, was ich brauche, kann es aber scheinbar nicht ohne Fehler verwenden. Ich bin überzeugt, dass der Fehler auf meiner Seite ist. Wenn es Ihnen nichts ausmacht, mir weiter zu helfen: Mein Wert ist ein Float und es ist in Sekunden. Ich habe es in einem Etikett angezeigt, wenn eine Taste gedrückt wird. Wohin würde Ihr Code gehen und wie würde ich dafür sorgen, dass auf meinem Etikett der Wert im HH: MM-Format angezeigt wird? Vielen Dank, Stu
Stumf

Sortiert, danke für deine Hilfe. Ihre Antwort und die Antwort von Pholker auf stackoverflow.com/questions/1259028/… waren der Grund, warum ich dies tun konnte!
Nochmals vielen

Tolles Zeug - machte dies zu einer Klassenmethode und rollte es in eine Kategorie auf NSString. Stimmen Sie mit Bitcruncher überein, sehr sauber.
Danilo Campos

Minuten berechnen, warum das Modulo der Division nehmen?!? minutes = totalSeconds / 60. Überkomplizieren Sie nicht.
Kadam

1
@ Kadam: Weil eine Stunde 60 Minuten hat. Wenn Sie das Modulo nicht hätten, würde Ihre Zeichenfolge 3600 Sekunden lang "01:60:00" anstelle von "01:00:00" lauten.

34

In iOS 8.0 und höheren Versionen ist dies ebenfalls möglich NSDateComponentsFormatter. Ich muss erwähnen, dass die Zeichenfolge ohne erste führende Null formatiert wird, zum Beispiel '9:30', aber nicht '09: 30 '. Wenn Sie jedoch Formatierer verwenden möchten, können Sie diesen Code verwenden:

-(NSString *)getTimeStringFromSeconds:(double)seconds
{
     NSDateComponentsFormatter *dcFormatter = [[NSDateComponentsFormatter alloc] init];
     dcFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
     dcFormatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute;
     dcFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
     return [dcFormatter stringFromTimeInterval:seconds];
}

Wenn Sie auch Sekunden im Ergebnis erhalten möchten, müssen Sie NSCalendarUnitSecondden erlaubten Einheiten eine Einheit hinzufügen. Dieses Beispiel funktioniert auch für Mac OS X-Anwendungen.
Edukulele

Dies erwartet ein Double, kein Int. Zumindest in Swift.
Nathan McKaskle

10

So mache ich es:

-(NSString *)formatTimeFromSeconds:(int)numberOfSeconds
{

    int seconds = numberOfSeconds % 60;
    int minutes = (numberOfSeconds / 60) % 60;
    int hours = numberOfSeconds / 3600;

    //we have >=1 hour => example : 3h:25m
    if (hours) {
        return [NSString stringWithFormat:@"%dh:%02dm", hours, minutes];
    }
    //we have 0 hours and >=1 minutes => example : 3m:25s
    if (minutes) {
        return [NSString stringWithFormat:@"%dm:%02ds", minutes, seconds];
    }
    //we have only seconds example : 25s
    return [NSString stringWithFormat:@"%ds", seconds];
}

7

Für Swift:

func formatTimeInSec(totalSeconds: Int) -> String {
    let seconds = totalSeconds % 60
    let minutes = (totalSeconds / 60) % 60
    let hours = totalSeconds / 3600
    let strHours = hours > 9 ? String(hours) : "0" + String(hours)
    let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes)
    let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds)

    if hours > 0 {
        return "\(strHours):\(strMinutes):\(strSeconds)"
    }
    else {
        return "\(strMinutes):\(strSeconds)"
    }
}

6

Während @Aks ' Antwort für Swift funktioniert, bin ich ein wenig skeptisch gegenüber der Hardcodierung von Werten in meinem Code. Die Antwort von @ edukulele ist viel sauberer, aber in Objective-C. Ich übersetzte es mit einer kleinen Änderung in Swift. Normalerweise schreibe ich meine Formatierer als lazy vars.

private lazy var dateFormatter: NSDateComponentsFormatter = {
    let formatter = NSDateComponentsFormatter()
    formatter.zeroFormattingBehavior = .Pad
    formatter.allowedUnits = [.Hour, .Minute, .Second]
    formatter.unitsStyle = .Positional
    return formatter
}()

Dies ist H:MMnicht HH:MMwie gewünscht.
Rudolf Adamkovič

1

Für Swift mit Uhrzeit

    var timer = NSTimer()
    var count = 1
    func updateTime() {
        count++
        let seconds = count % 60
        let minutes = (count / 60) % 60
        let hours = count / 3600
        let strHours = hours > 9 ? String(hours) : "0" + String(hours)
        let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes)
        let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds)

        if hours > 0 {
            clockOutlet.text = "\(strHours):\(strMinutes):\(strSeconds)"
        }
        else {
            clockOutlet.text = "\(strMinutes):\(strSeconds)"
        }   
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.