2016-08-07 32 views
5

Mam wartość NSDate. Muszę sprawdzić (porównać z bieżącym czasem systemu), czy jest to wczoraj, czy nie. Myślałem, że to było łatwe, ponieważ mogłem po prostu wyciągnąć wartość dnia z moich NSDate i +1, aby to porównać. Ale wkrótce potem zrozumiałem, że to nieodpowiedni pomysł, bo co, jeśli to koniec miesiąca, powiedzmy, 31 lipca. A następny dzień to nie 31 lipca, to 1 sierpnia.Swift - Jak sprawdzić, czy NSDate jest wczoraj w porównaniu do bieżącego czasu?

Jaki jest najskuteczniejszy sposób sprawdzenia, czy NSDate jest wczoraj (w porównaniu do obecnego czasu)?

+0

Właśnie w celu wyjaśnienia, czy chcesz, aby dowiedzieć się, czy jest to blisko 24 godzin temu lub tylko jeśli data jest o jeden dzień krótsza, ignorując składniki czasu? – ColGraff

+0

Dziękuję za pytanie. Chcę tylko sprawdzić, czy data jest o jeden dzień mniej, a nie 24 godziny temu. Odpowiedź Rob'a doskonale rozwiązała mój problem. Jeśli masz lepszą odpowiedź, zostaw ją tam. Zdecydowanie to sprawdzę! –

+0

Nie, jego jest na miejscu. Właśnie sprawdzałem, żeby się upewnić. – ColGraff

Odpowiedz

11

Jako iOS 8.0, można użyć -[NSCalendar isDateInYesterday:], tak:

let calendar = NSCalendar.autoupdatingCurrentCalendar() 

let someDate: NSDate = some date... 
if calendar.isDateInYesterday(someDate) { 
    // It was yesterday... 
} 

Jeśli będziesz robił to dużo, należy utworzyć kalendarz raz i przechowywać go w zmiennej instancji, ponieważ tworzenie obiekt kalendarza nie jest trywialny.

+1

Zrobiłem wstępne testy i nie uważam, że utrzymywanie zmiennej instancji 'NSCalendar.autoupdatingCurrentCalendar()' jest lepsze niż pobieranie jej za każdym razem. To będzie odniesienie w obu kierunkach. – ColGraff

+0

[Najwyraźniej 'NSCalendar' stał się znacznie tańszy w tworzeniu w systemie iOS 7/OS X 10.9.] (Http://mikeabdullah.net/NSCalendar_currentCalendar.html) –

+0

Myślisz, że NSDateFormatter też? –

5

W Swift 3.0 API zmieniła:

NSCalendar.current.isDateInToday(yourDate) 
NSCalendar.current.isDateInYesterday(yourDate) 
NSCalendar.current.isDateInTomorrow(yourDate) 

Aby uzyskać bieżącą datę:

let now = Date()