J'ai du code qui obtient la différence de temps entre aujourd'hui et une autre chaîne de temps.compte à rebours NSTimer produisant 0 deux fois
L'affichage est actualisé toutes les secondes en utilisant NSTimer.scheduledTimerWithTimeInterval
.
Tout fonctionne correctement, sauf lorsque la minuterie atteint 0. 0
est affiché deux fois.
Exemple:
3,2,1,0,0,-1,-2
Voici mon code fait fait dans la cour:
//: Playground - Time Countdown
import UIKit
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely()
class MyClass {
var totalSecondsText = ""
init(classSecondsText: String){
totalSecondsText = classSecondsText
}
@objc func ontimer(timer:NSTimer!){
let total = determineTimeDifference(totalSecondsText)
let (hour,min,sec) = secondsConverter(total)
if hour >= 1 {
if min >= 1 {
NSLog(String(hour)+"h "+String(min)+"m")
}else {
NSLog(String(hour)+"h")
}
}else{
if min >= 1{
NSLog(String(min)+"m "+String(sec)+"s")
} else if min > -1 {
NSLog(String(sec)+"s")
} else if min <= -1 {
NSLog(String(min)+"m")
}
}
}
func determineTimeDifference(timeInputed: String) -> Int {
let dateFormat = NSDateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let finalDate = dateFormat.dateFromString(raceTime)
let differenceTimeInSeconds = (finalDate?.timeIntervalSinceNow)!
return differenceInSeconds
}
func secondsConverter (seconds : Int) -> (Int , Int, Int){
return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60)
}
}
// Add +1 minute on time to test.
var dateString = "2016-08-31T6:49:00Z"
NSTimer.scheduledTimerWithTimeInterval(1, target: MyClass(classSecondsText: dateString), selector: #selector(MyClass.ontimer(_:)), userInfo: nil, repeats: true)
Toute idée sur ce qui a mal tourné?
Mise à jour:
Comme promis, voici le correctif de bug pour ce numéro:
func determineTimeDifference(timeInputed: String) -> Int {
let dateFormat = NSDateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let finalDate = dateFormat.dateFromString(raceTime)?.timeIntervalSince1970
let dateNow = NSDate().timeIntervalSince1970
let differenceTimeInSeconds = Int(finalDate) - Int(dateNow)
return differenceInSeconds
}
Merci! Même si je n'ai pas compris clairement votre explication (je suis un novice dans swift) Cela m'a beaucoup expliqué. Une dernière chose, que voulez-vous dire par arrondi fois unix? – Led
après avoir lu votre explication à fond je l'ai eu. Merci! – Led
Vous êtes les bienvenus. Les temps unix arrondis signifient des temps au format unix, qui viennent avec la valeur arrondie du temps unix claqué nettoyé de la partie décimale désordonnée, qui pourrait éventuellement causer une erreur dans le comptage. Par exemple. arrondir 1,459 serait 1, 1,668 => 2 etc. Peut-être, si le composant Calendrier traduit l'heure, il y a une partie de .2873 ... dedans, il compte comme une seconde entière. Donc en l'arrondissant nous nous débarrassons de cette erreur possible. – pedrouan