2016-05-06 18 views
2

Ich bin ein Neuling sowohl bei Swift (und Codierung im Allgemeinen) und Stack-Überlauf. SO war enorm hilfreich beim Code-Lernen, also vielen Dank an die SO-Community für tolle Fragen und Antworten. HierFinden Sie Übereinstimmungen in NSDate Array - Swift

geht meine erste Frage SO ...

Ich habe meine Räder für ein paar Tage jetzt auf diese Herausforderung zu spinnen. Ich habe mehrere Lösungsvorschläge gelesen und ausprobiert, aber keiner von ihnen hat bisher für mich funktioniert.

Ich habe eine dynamische NSDate-Array, die von einer Web-API (mit früheren Code) abgerufen wird.

[2016-05-01 03:27:22 +0000, 2016-05-01 03:27:24 +0000, 2016-05-01 03:27:25 +0000, 2016-05-01 03:27:27 +0000, 2016-05-03 12:48:07 +0000, 2016-05-03 12:48:09 +0000, 2016-05-03 12:48:11 +0000, 2016-05-03 12:48:13 +0000, 2016-05-03 19:52:46 +0000, 2016-05-03 19:52:51 +0000, 2016-05-03 19:52:56 +0000, 2016-05-04 00:37:27 +0000, 2016-05-04 00:37:30 +0000, 2016-05-04 12:36:17 +0000, 2016-05-04 12:36:19 +0000, 2016-05-04 12:46:26 +0000, 2016-05-04 12:46:28 +0000, 2016-05-04 17:39:31 +0000, 2016-05-04 17:39:34 +0000, 2016-05-04 17:54:24 +0000, 2016-05-04 23:46:20 +0000] 

ich eine Methode oben, dass irgendwelche Elemente in dem Array sind, wenn dort zu sehen, durch die obige Anordnung und prüft, Schleifen, die innerhalb der letzten x Minuten timestamped werden.

func prepareJSONData1() { 

    let currentDate = NSDate() 
    var startDate = currentDate.dateByAddingTimeInterval(-5 * 60) //sets the start date to 5 minutes prior to current time 


    while startDate.compare(currentDate) != NSComparisonResult.OrderedDescending { 

     var i = Int(0) //setting up a counter 

     for i in 0...self.quantumArrayNSDate.count - 1 { 

      if startDate == self.quantumArrayNSDate[i] { 
       print("Data entry found for \(startDate) timestamp") 
      } 
      self.i += 1 
     } 

     startDate = startDate.dateByAddingTimeInterval(1) //increment through the NSDate range 

    } 
} 

Ich kann nicht diesen Code erhalten, um passende Artikel ganz gleich zurückgeben, wie weit zurück habe ich den Starttermin (auch wenn ich wieder ein paar Monate gehen). Ich vermute, dass ich nicht die startdate Variable richtig einstellen, denn wenn ich dieses Stück Code zu ändern:

startDate = quantumArrayNSDate.first! 

der Code gibt in dem Array alle Elemente Dann, als ich erwarten würde es.

Ich habe auch versucht, diesen anderen Ansatz ohne Erfolg:

let calendar = NSCalendar.currentCalendar() 
    let startDate = calendar.dateByAddingUnit(.Minute, value: -5, toDate: NSDate(), options: [])!  // <- this didn't work 

ich wäre super dankbar, wenn jemand darauf hinweisen könnte, was ich falsch mache und eine Lösung vorschlagen. Vielen Dank!

Antwort

0

NSDate stellt einen Zeitpunkt dar und wird als das Zeitintervall in Sekunden seit dem Referenzdatum 1. Januar 2001, UTC gespeichert. Dieses Zeitintervall ist eine Fließkommazahl (NSTimeInterval aka Double) und enthält auch Sekundenbruchteile. So zwei NSDate s innerhalb der gleichen Sekunde erstellt wurden, können unterschiedlich sein:

let date1 = NSDate() 
let date2 = NSDate() 
print(date1 == date2) 
// false 
print(date2.timeIntervalSinceDate(date1)) 
// 5.00679016113281e-06 

Ihr Test auf Gleichheit

if startDate == self.quantumArrayNSDate[i] 

schlägt fehl, wenn beide Daten genau den gleichen Zeitpunkt bis zu Sekundenbruch Präzision darstellen.

Sie können mit

for date in quantumArrayNSDate { 
    if date.compare(startDate) == .OrderedDescending 
    && date.compare(currentDate) == .OrderedAscending { 
     // ... 
    } 
} 

innerhalb des gegebenen Zeitintervall, über die Termine laufen oder eine Liste passender Termin mit

let filteredDates = quantumArrayNSDate.filter { date in 
    date.compare(startDate) == .OrderedDescending 
     && date.compare(currentDate) == .OrderedAscending 
} 

Um zu überprüfen, wenn zwei Daten gleich bis zu zweiten Granularität sind können Sie verwenden

if calendar.compareDate(date, toDate: currentDate, toUnitGranularity: .Second) == .OrderedSame { 
    // ... 
} 
+0

Vielen Dank, Martin. Lief wie am Schnürchen! –