webentwicklung-frage-antwort-db.com.de

Finden Sie die Differenz zwischen NSDates in Sekunden als Ganzzahl mit Swift

Ich schreibe einen Code, in dem ich festlegen möchte, wie lange eine Taste gedrückt wurde. Dazu habe ich beim Drücken der Taste eine NSDate() aufgenommen und beim Loslassen der Taste die timeIntervalSinceDate-Funktion ausprobiert. Das scheint zu funktionieren, aber ich finde keine Möglichkeit, das Ergebnis zu drucken oder auf eine Ganzzahl umzurechnen.

var timeAtPress = NSDate() 

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

Ich habe ein paar ähnliche Fragen gesehen, aber ich kenne C nicht, daher fiel es mir schwer, die Antworten zu verstehen. Wenn es eine effizientere Methode gibt, um herauszufinden, wie lange der Knopf gedrückt wurde, bin ich für Vorschläge offen. Danke im Voraus.

71
Erik

Ihr Versuch, elapsedTime zu berechnen, ist falsch. In Swift 3 wäre es:

let elapsed = Date().timeIntervalSince(timeAtPress)

Beachten Sie den () nach der Date-Referenz. Date() instanziiert ein neues Datumsobjekt und gibt timeIntervalSince die Zeitdifferenz zwischen diesem und timeAtPress zurück. Dies gibt einen Gleitkommawert zurück (technisch gesehen ein TimeInterval).

Wenn Sie möchten, dass der Wert auf einen Int-Wert gekürzt wird, können Sie einfach Folgendes verwenden:

let duration = Int(elapsed)

Übrigens, Ihre Definition der Variable timeAtPress muss kein Date-Objekt instanziieren. Ich nehme an, Sie beabsichtigten:

var timeAtPress: Date!

Das definiert die Variable als Date-Variable (eine implizit nicht verpackte), aber Sie würden vermutlich die tatsächliche Instantiierung dieser Variablen verschieben, bis pressed aufgerufen wird.


Alternativ verwende ich oft CFAbsoluteTimeGetCurrent() , z.

var start: CFAbsoluteTime!

Und wenn ich startTime einstellen möchte, mache ich Folgendes:

start = CFAbsoluteTimeGetCurrent()

Und wenn ich die Anzahl der verstrichenen Sekunden berechnen möchte, mache ich Folgendes:

let elapsed = CFAbsoluteTimeGetCurrent() - start

Es ist erwähnenswert, dass die Dokumentation CFAbsoluteTimeGetCurrent uns warnt:

Wiederholte Aufrufe dieser Funktion garantieren keine monoton steigenden Ergebnisse. Die Systemzeit kann sich aufgrund der Synchronisierung mit externen Zeitreferenzen oder aufgrund eines expliziten Benutzerwechsels der Uhr verringern.

Dies bedeutet, dass Sie, wenn Sie unglücklich genug sind, um die abgelaufene Zeit zu messen, wenn eine dieser Anpassungen stattfindet, zu einer falschen Berechnung der abgelaufenen Zeit führen können. Dies gilt auch für NSDate/Date-Berechnungen. Es ist am sichersten, eine mach_absolute_time-basierte Berechnung zu verwenden (am einfachsten mit CACurrentMediaTime ):

let start = CACurrentMediaTime()

und

let elapsed = CACurrentMediaTime() - start

Dies verwendet mach_absolute_time, vermeidet jedoch einige der in Technische Fragen und Antworten QA1398 beschriebenen Komplexitäten.

Denken Sie jedoch daran, dass CACurrentMediaTime/mach_absolute_time beim Neustart des Geräts zurückgesetzt wird. Unterm Strich also, wenn Sie genaue Berechnungen der abgelaufenen Zeit benötigen, während eine App ausgeführt wird, verwenden Sie CACurrentMediaTime. Wenn Sie diese Startzeit jedoch in einem permanenten Speicher speichern möchten, an den Sie sich möglicherweise erinnern, wenn die App zu einem späteren Zeitpunkt erneut gestartet wird, müssen Sie Date oder CFAbsoluteTimeGetCurrent verwenden, und Sie müssen nur mit eventuellen Ungenauigkeiten leben.

166
Rob

NSDate () und NSCalendar () klingen nach einer guten Wahl. Verwenden Sie die Kalenderberechnung und überlassen Sie den eigentlichen mathematischen Teil dem Framework. Hier ist ein schnelles Beispiel, wie man die Sekunden zwischen zwei NSDate() bekommt.

let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")
20
Freddy

Entsprechend der Antwort von Freddy ist dies die Funktion in Swift 3:

let start = Date()
        let enddt = Date(timeIntervalSince1970: 100)
        let calendar = Calendar.current
        let unitFlags = Set<Calendar.Component>([ .second])
        let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt)
        let seconds = datecomponenets.second
        print("Seconds: \(seconds)")
3
LagMaster

Swift 5

    let startDate = Date()
    let endDate = Date()
    let calendar = Calendar.current
    let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
    let seconds = dateComponents.rawValue
    print("Seconds: \(seconds)")
2
Ahmed Safadi

So können Sie den Unterschied in der neuesten Version von Swift 3 feststellen

let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds

Referenz: Den Unterschied zwischen zwei NSDaten in (Monate/Tage/Stunden/Minuten/Sekunden) ermitteln

0
Rujoota Shah