Derzeit verwende ich dateA.compare (dateB), aber es gibt einen falschen Wert zurück, wenn zwei Daten bis Sekunden identisch sind.Ich möchte zwei NSDate bis zu Millisekunden vergleichen. Wie macht man das in swift?
Antwort
In einem NSDate
ist der Millisekundenanteil der Bruchteil von NSDate(). timeIntervalSinceReferenceDate
. Sie müssen lediglich zwischen zwei Werten unterscheiden, indem Sie die Daten verwenden, die Sie vergleichen möchten.
Hatte ein wenig Spaß dabei, Operator für NSDates zu überlasten, also hier ist alle Vergleichsoperatoren, die Sie benötigen würden. Das einzige, was Sie anpassen müssen, ist, innerhalb welcher Zeitspanne die Daten in der Variablen timeMargin
gleich sind.
let timeMargin = 0.1
func ==(left: NSDate, right : NSDate) -> Bool {
let leftTime = left.timeIntervalSinceNow
let rightTime = right.timeIntervalSinceNow
let diff = abs(leftTime - rightTime)
return diff <= timeMargin
}
func >(left: NSDate, right : NSDate) -> Bool {
let leftTime = left.timeIntervalSinceNow
let rightTime = right.timeIntervalSinceNow
let marginalTime = leftTime - rightTime
return marginalTime > 0
}
func <(left: NSDate, right : NSDate) -> Bool {
let leftTime = left.timeIntervalSinceNow
let rightTime = right.timeIntervalSinceNow
let marginalTime = leftTime - rightTime
return marginalTime < 0
}
func >=(left: NSDate, right : NSDate) -> Bool {
let leftTime = left.timeIntervalSinceNow
let rightTime = right.timeIntervalSinceNow
let marginalTime = leftTime - rightTime
return marginalTime >= -timeMargin
}
func <=(left: NSDate, right : NSDate) -> Bool {
let leftTime = left.timeIntervalSinceNow
let rightTime = right.timeIntervalSinceNow
let marginalTime = leftTime - rightTime
return marginalTime <= timeMargin
}
Implementierung
let date1 = NSDate()
let date2 = NSDate().dateByAddingTimeInterval(0.08)
date1 == date2 ? "Date1 is equal to Date2" : "Date is NOT equal to Date2"
//Prints("Date1 is equal to Date2")
date1 < date2 ? "Date1 is less than Date2" : "Date is NOT less than Date2"
//Prints("Date is less than Date2")
date1 > date2 ? "Date1 is more than Date2" : "Date is NOT more than Date2"
//Prints("Date1 is NOT more than Date2")
date1 <= date2 ? "Date1 is less than or equal to Date2" : "Date is NOT less than or equal to Date2"
//Prints("Date1 is less than or equal to Date2")
date1 >= date2 ? "Date1 is greater than or equal to Date2" : "Date is NOT more than or equal to Date2"
//Prints("Date1 is greater than or equal to Date2")
Hinweis:
Mit dateByAddingTimeInterval
hat die EXACT Zuwachs zu der Zeit nicht immer zurück. ich. e. NSDate().dateByAddingTimeInterval(0.10)
Könnte in der Realität 0,100hinzufügen und daher würde es ein unerwünschtes Ergebnis zurückgeben, wenn es sich um einen Haarlinienanteil handelt, der kleiner oder größer als Ihr Zeitabstand ist. Seien Sie also vorsichtig, wenn Sie dies vor dem Vergleich der Daten verwenden.
Können Sie einen [MCVE] bereitstellen? – IanS