Trouver la différence en secondes entre les NSDates sous forme d’entier en utilisant Swift

J’écris un morceau de code où je veux chronométrer combien de temps un bouton a été maintenu. Pour ce faire, j’ai enregistré un NSDate() lorsque le bouton a été pressé et timeIntervalSinceDate essayé d’utiliser la fonction timeIntervalSinceDate lorsque le bouton était relâché. Cela semble fonctionner, mais je ne trouve aucun moyen d’imprimer le résultat ou de le convertir en entier.

 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 = ??? } 

J’ai vu quelques questions similaires, mais je ne connais pas C, alors j’ai eu du mal à comprendre les réponses données. S’il existe un moyen plus efficace de savoir combien de temps le bouton a été enfoncé, je suis ouvert aux suggestions. Merci d’avance.

Votre tentative de calculer elapsedTime est incorrecte. Dans Swift 3, ce serait:

 let elapsed = Date().timeIntervalSince(timeAtPress) 

Notez le () après la référence de Date . La Date() instancie un nouvel object date, puis timeIntervalSince renvoie la différence de temps entre celle-ci et timeAtPress . Cela retournera une valeur en virgule flottante (techniquement, un TimeInterval ).

Si vous souhaitez que tronqué à une valeur Int , vous pouvez simplement utiliser:

 let duration = Int(elapsed) 

Et, BTW, votre définition de la variable timeAtPress n’a pas besoin d’instancier un object Date . Je présume que vous aviez l’intention:

 var timeAtPress: Date! 

Cela définit la variable comme une variable Date (une variable implicitement déballée), mais vous présumez probablement différer l’instanciation réelle de cette variable jusqu’à ce que vous appuyiez pressed .


Sinon, j’utilise souvent CFAbsoluteTimeGetCurrent() , par exemple,

 var start: CFAbsoluteTime! 

Et quand je veux définir startTime , je fais ce qui suit:

 start = CFAbsoluteTimeGetCurrent() 

Et quand je veux calculer le nombre de secondes écastings, je fais ce qui suit:

 let elapsed = CFAbsoluteTimeGetCurrent() - start 

Il est à noter que la documentation CFAbsoluteTimeGetCurrent nous avertit:

Les appels répétés à cette fonction ne garantissent pas des résultats monotoniquement croissants. L’heure du système peut diminuer en raison de la synchronisation avec des références de temps externes ou en raison d’un changement d’utilisateur explicite de l’horloge.

Cela signifie que si vous avez le malheur de mesurer le temps écoulé lorsque l’un de ces ajustements a lieu, vous pouvez vous retrouver avec un calcul du temps écoulé incorrect. Cela est également vrai pour les NSDate / Date . Il est plus sûr d’utiliser un mach_absolute_time basé sur mach_absolute_time (plus facile avec CACurrentMediaTime ):

 let start = CACurrentMediaTime() 

et

 let elapsed = CACurrentMediaTime() - start 

Cela utilise mach_absolute_time , mais évite certaines de ses complexités décrites dans QA1398 .

Rappelez-vous cependant que CACurrentMediaTime / mach_absolute_time sera réinitialisé au redémarrage du périphérique. Donc, si vous avez besoin de calculs précis du temps écoulé pendant l’exécution d’une application, utilisez CACurrentMediaTime . Mais si vous souhaitez enregistrer cette heure de début dans un stockage persistant dont vous vous souviendrez peut-être lorsque l’application sera redémarrée à une date ultérieure, vous devez utiliser Date ou CFAbsoluteTimeGetCurrent , et ne vivre que des inexactitudes.

NSDate () et NSCalendar () semblent être un bon choix. Utilisez le calcul du calendrier et laissez la partie mathématique réelle au framework. Voici un exemple rapide d’obtention des secondes entre deux NSDate()

 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)") 

Selon la réponse de Freddy, c’est la fonction dans swift 3:

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

Voilà comment vous pouvez obtenir la différence dans la dernière version de Swift 3

 let calendar = NSCalendar.current var compos:Set = Set() 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 

Référence: Obtenir la différence entre deux NSDates en (mois / jours / heures / minutes / secondes)

Pour Swift 3 secondes entre 2 heures en “hh: mm”

 func secondsIn(_ str: Ssortingng)->Int{ var strArr = str.characters.split{$0 == ":"}.map(Ssortingng.init) var sec = Int(strArr[0])! * 3600 var sec1 = Int(strArr[1])! * 36 print("sec") print(sec+sec1) return sec+sec1 } 

Usage

 var sec1 = secondsIn(shuttleTime) var sec2 = secondsIn(dateToSsortingng(Date())) print(sec1-sec2)