Frage

Ich habe eine Menge von seconds bekam, die von einem bestimmten Ereignis übergeben. Es ist in einem NSTimeInterval Datentyp gespeichert.

Ich mag es in minutes und seconds konvertieren.

Zum Beispiel habe ich: „326,4“ Sekunden und ich möchte es in die folgenden Zeichenfolge konvertieren: "5.26".

Was ist der beste Weg, um dieses Ziel zu erreichen?

Danke.

War es hilfreich?

Lösung

Pseudo-Code:

minutes = floor(326.4/60)
seconds = round(326.4 - minutes * 60)

Andere Tipps

Kurzbeschreibung

  1. Die Antwort von Brian Ramsay ist bequemer, wenn Sie nur Minuten konvertieren möchten.
  2. Wenn Sie Cocoa-API soll es für Sie tun und konvertieren Sie Ihre NSTimeInterval nicht nur Minuten, sondern auch zu Tage, Monate, Wochen, etc ... Ich denke, dies ist ein generischer Ansatz
  3. Mit NSCalendar Methode:

    • (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

    • „Returns, als NSDateComponents Objekt angegebenen Komponenten, die Differenz zwischen beiden mitgelieferten Daten“. Von der API-Dokumentation.

  4. Erstellen 2 NSDate, deren Differenz die NSTimeInterval Sie konvertieren möchten. (Wenn Ihr NSTimeInterval kommt aus dem Vergleich 2 NSDate Sie nicht brauchen, um diesen Schritt zu tun, und Sie brauchen nicht einmal die NSTimeInterval).

  5. Erhalten Sie Ihre Zitate aus NSDateComponents

Beispielcode

// The time interval 
NSTimeInterval theTimeInterval = 326.4;

// Get the system calendar
NSCalendar *sysCalendar = [NSCalendar currentCalendar];

// Create the NSDates
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; 

// Get conversion to months, days, hours, minutes
unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;

NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

NSLog(@"Conversion: %dmin %dhours %ddays %dmoths",[conversionInfo minute], [conversionInfo hour], [conversionInfo day], [conversionInfo month]);

[date1 release];
[date2 release];

Bekannte Probleme

  • Zu viel für nur eine Umwandlung, sind Sie hier richtig, aber das ist, wie die API funktioniert.
  • Mein Vorschlag:., Wenn Sie gewöhnen Ihre Zeitdaten mit NSDate und NSCalendar zu verwalten, die API wird für Sie die harte Arbeit

Alle diese aussehen komplizierter als sie sein müssen! Hier ist eine kurze und süße Weise ein Zeitintervall in Stunden, Minuten und Sekunden zu konvertieren:

NSTimeInterval timeInterval = 326.4;
long seconds = lroundf(timeInterval); // Since modulo operator (%) below needs int or long

int hour = seconds / 3600;
int mins = (seconds % 3600) / 60;
int secs = seconds % 60;

Hinweis, wenn Sie einen Schwimmer in einen int setzen, erhalten Sie Stock () automatisch, aber Sie können es auf den ersten beiden hinzufügen, wenn wenn macht Sie sich besser fühlen: -)

Verzeihen Sie mir ein Stapel Jungfrau zu sein ... Ich bin nicht sicher, wie Brian Ramsay Antwort auf Antwort ...

Runde Verwendung wird für die zweiten Wert zwischen 59,5 und 59,99999 nicht. Der zweite Wert wird 60 in diesem Zeitraum. Verwenden Sie trunc statt ...

 double progress;

 int minutes = floor(progress/60);
 int seconds = trunc(progress - minutes * 60);

Wenn Sie auf oder über iOS 8 oder OS X Targeting sind 10.10, diese sind gerade sehr viel einfacher. Die neue NSDateComponentsFormatter Klasse ermöglicht es Ihnen, einen bestimmten NSTimeInterval von seinem Wert in Sekunden auf eine lokalisierte Zeichenfolge konvertieren den Benutzer zu zeigen. Zum Beispiel:

Objective-C

NSTimeInterval interval = 326.4;

NSDateComponentsFormatter *componentFormatter = [[NSDateComponentsFormatter alloc] init];

componentFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
componentFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropAll;

NSString *formattedString = [componentFormatter stringFromTimeInterval:interval];
NSLog(@"%@",formattedString); // 5:26

Swift

let interval = 326.4

let componentFormatter = NSDateComponentsFormatter()

componentFormatter.unitsStyle = .Positional
componentFormatter.zeroFormattingBehavior = .DropAll

if let formattedString = componentFormatter.stringFromTimeInterval(interval) {
    print(formattedString) // 5:26
}

NSDateCompnentsFormatter ermöglicht auch diese Ausgabe in mehr Formen zu sein. Weitere Informationen finden Sie in NSHipster NSFormatter Artikel . Und je nachdem, welche Klassen sind Sie bereits mit (wenn nicht NSTimeInterval) arbeiten, kann es günstiger sein, die Forma eine Instanz von NSDateComponents zu passieren, oder zwei NSDate Objekte, die auch über die folgenden Verfahren durchgeführt werden kann.

Objective-C

NSString *formattedString = [componentFormatter stringFromDate:<#(NSDate *)#> toDate:<#(NSDate *)#>];
NSString *formattedString = [componentFormatter stringFromDateComponents:<#(NSDateComponents *)#>];

Swift

if let formattedString = componentFormatter.stringFromDate(<#T##startDate: NSDate##NSDate#>, toDate: <#T##NSDate#>) {
    // ...
}

if let formattedString = componentFormatter.stringFromDateComponents(<#T##components: NSDateComponents##NSDateComponents#>) {
    // ...
}

Brian Ramsay Code de-pseudofied:

- (NSString*)formattedStringForDuration:(NSTimeInterval)duration
{
    NSInteger minutes = floor(duration/60);
    NSInteger seconds = round(duration - minutes * 60);
    return [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
}

Hier ist eine Swift-Version:

func durationsBySecond(seconds s: Int) -> (days:Int,hours:Int,minutes:Int,seconds:Int) {
    return (s / (24 * 3600),(s % (24 * 3600)) / 3600, s % 3600 / 60, s % 60)
}

Kann wie folgt verwendet werden:

let (d,h,m,s) = durationsBySecond(seconds: duration)
println("time left: \(d) days \(h) hours \(m) minutes \(s) seconds")
    NSDate *timeLater = [NSDate dateWithTimeIntervalSinceNow:60*90];

    NSTimeInterval duration = [timeLater  timeIntervalSinceNow];

    NSInteger hours = floor(duration/(60*60));
    NSInteger minutes = floor((duration/60) - hours * 60);
    NSInteger seconds = floor(duration - (minutes * 60) - (hours * 60 * 60));

    NSLog(@"timeLater: %@", [dateFormatter stringFromDate:timeLater]);

    NSLog(@"time left: %d hours %d minutes  %d seconds", hours,minutes,seconds);

Ausgänge:

timeLater: 22:27
timeLeft: 1 hours 29 minutes  59 seconds

Da es im Wesentlichen eine doppelte ...

Divide by 60.0 und extrahieren Sie den integralen Bestandteil und den Bruchteil.

Der integrale Bestandteil wird die gesamte Anzahl von Minuten.

Multiplizieren der Bruchteil von 60,0 wieder.

Das Ergebnis werden die verbleibenden Sekunden.

Denken Sie daran, dass die ursprüngliche Frage ist über einen String-Ausgang, nicht Pseudo-Code oder einzelnen String-Komponenten.

  

Ich mag es in die folgenden Zeichenfolge konvertieren: „5.26“

Viele Antworten fehlen die Internationalisierung Probleme und die meisten tun die mathematischen Berechnungen von Hand. Alles nur so 20. Jahrhundert ...

Do the Math nicht selbst tun (Swift 4)

let timeInterval: TimeInterval = 326.4
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = .positional
if let formatted = dateComponentsFormatter.string(from: timeInterval) {
    print(formatted)
}
  

5.26


Leverage auf Bibliotheken

Wenn Sie wirklich einzelne Komponenten mögen, und angenehm lesbaren Code Besuche SwiftDate :

import SwiftDate
...
if let minutes = Int(timeInterval).seconds.in(.minute) {
    print("\(minutes)")
}
  

5


Credits @mickmaccallum und @ polarwar für eine angemessene Nutzung von DateComponentsFormatter

Wie ich tue dies in Swift (einschließlich der String-Formatierung, es zu zeigen, wie "1.23"):

let totalSeconds: Double = someTimeInterval
let minutes = Int(floor(totalSeconds / 60))
let seconds = Int(round(totalSeconds % 60))        
let timeString = String(format: "%02d:%02d", minutes, seconds)
NSLog(timeString)

Swift 2-Version

extension NSTimeInterval {
            func toMM_SS() -> String {
                let interval = self
                let componentFormatter = NSDateComponentsFormatter()

                componentFormatter.unitsStyle = .Positional
                componentFormatter.zeroFormattingBehavior = .Pad
                componentFormatter.allowedUnits = [.Minute, .Second]
                return componentFormatter.stringFromTimeInterval(interval) ?? ""
            }
        }
    let duration = 326.4.toMM_SS()
    print(duration)    //"5:26"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top