2016-03-25 2 views
0

Ich muss zwei Mal in Swift vergleichen und mit NSComparisonResult konnte ich korrekte Ergebnis erhalten, bis es Zeit zwischen 22.00 Uhr - 23.59 Uhr kommt. Es zeigt das entgegengesetzte Ergebnis für diese Zeiten. Wer weiß, was ist das Problem? Im Folgenden finden Sie Beispielcode und Szenarien. 10:30:00 Uhr ist Beispiel Zeit zu testen, aber Sie können es jederzeit testen.NSComparisonResult funktioniert nicht wie erwartet für 10 PM und höher

// For test, Current time 10:30:00 PM 
let currentTime = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .LongStyle) 

let closeTimeCompareResult: NSComparisonResult = currentTime.compare("10:00:00 PM EDT") 
print("DinnerClose: \(closeTimeCompareResult.rawValue)") 
// Expected result is -1 but, getting as 1 

// It works perfect until 9:59:59 PM 
let closeTimeCompareResult9: NSComparisonResult = currentTime.compare("9:00:00 PM EDT") 
print("DinnerClose: \(closeTimeCompareResult9.rawValue)") 
// As expected result is -1 
+0

Sie * Strings vergleichen * und nicht die Termine ... –

Antwort

2

Sie führen einen Stringvergleich durch. So sind zu vergleichen Sie diese beiden Strings, zum Beispiel:

10:00:00 PM EDT 
9:00:00 PM EDT 

Ein String-Vergleich vergleicht die entsprechenden Zeichen der einzelnen Strings, mit dem ersten Zeichen jedes beginnen. Das erste Zeichen von "10:00:00 PM EDT" ist "1" und das erste Zeichen von "9:00:00 PM EDT" ist "9". In Unicode und ASCII ist "9" Codestelle 57 und "1" ist Codestelle 49. Seit 57> 49, "9" > "1" und "9:00:00 PM EDT" > "10:00:00 PM EDT".

Wahrscheinlich möchten Sie die Stunde, Minute und Sekunde aus dem Eingabedatum extrahieren und dann numerisch vergleichen. Wenn Sie Xcode 7.3 mit Swift 2.2 aktualisiert haben, dann können Sie eine tuple comparison wie folgt verwenden:

let date = NSDate() 
let components = NSCalendar.currentCalendar().components([.Hour, .Minute, .Second], fromDate: date) 
let hms = (components.hour, components.minute, components.second) 
if hms >= (21, 0, 0) && hms < (22, 30, 0) { 
    print("\(date) is between 9 PM and 10:30 PM in the system's time zone.") 
} 
+0

Danke, ja, ich habe den Vergleich Saiten. Lass mich mit diesem Ansatz versuchen. –

+0

Es funktioniert perfekt, danke nochmal @rob –

Verwandte Themen