Jak sprawdzić, czy dana osoba NSDate
należy do dzisiaj?
Kiedyś sprawdzałem to używając pierwszych 10 znaków z [aDate description]
. [[aDate description] substringToIndex:10]
zwraca ciąg w taki "YYYY-MM-DD"
sposób, że porównałem ciąg z ciągiem zwróconym przez [[[NSDate date] description] substringToIndex:10]
.
Czy istnieje szybszy i / lub schludniejszy sposób sprawdzenia?
Dzięki.
ios
objective-c
cocoa-touch
nsdate
nscalendar
Seunghoon
źródło
źródło
Odpowiedzi:
W macOS 10.9+ i iOS 8+ w NSCalendar / Calendar jest metoda, która robi dokładnie to!
Więc po prostu to zrobisz
Cel C:
Swift 3:
źródło
Możesz porównać składniki daty:
Edytować:
Bardziej podoba mi się metoda Stefana, myślę, że jest ona czystsza i bardziej zrozumiała, jeśli stwierdzenie:
Chris, uwzględniłem twoją sugestię. Musiałem sprawdzić, jaka była era, więc dla każdego, kto nie wie, rozróżnia ona BC i AD. Jest to prawdopodobnie niepotrzebne dla większości ludzi, ale łatwo to sprawdzić i dodaje pewności, więc dołączyłem to. Jeśli zależy ci na szybkości, prawdopodobnie i tak nie jest to dobra metoda.
UWAGA podobnie jak w przypadku wielu odpowiedzi na SO, po 7 latach jest to całkowicie nieaktualne. W Swift teraz po prostu użyj
.isDateInToday
źródło
To jest pochodna twojego pytania, ale jeśli chcesz wydrukować NSDate z „Dzisiaj” lub „Wczoraj”, użyj funkcji
dla NSDateFormatter
źródło
Spróbowałbym znormalizować dzisiejszą datę do północy i drugą datę, znormalizować do północy, a następnie porównać, czy jest to ta sama NSDate.
Z przykładu Apple, oto jak normalizujesz do dzisiejszej północy, zrób to samo dla drugiej daty i porównaj:
źródło
Working Swift 3 i 4 rozszerzenie sugestii Catfish_Man:
źródło
Nie ma potrzeby żonglowania komponentami, epokami i innymi rzeczami.
NSCalendar zapewnia metodę pobierania początku określonej jednostki czasu dla istniejącej daty.
Ten kod rozpocznie dzisiejszy dzień i inną datę i porówna to. Jeśli oszacuje
NSOrderedSame
, obie daty przypadają w tym samym dniu - czyli dzisiaj.źródło
Pracował dla mnie w Swift 2.0
źródło
Szybka wersja najlepszej odpowiedzi:
źródło
Zapoznaj się z wpisem dokumentacji Apple zatytułowanym „Wykonywanie obliczeń kalendarza” [łącze] .
Listing 13 na tej stronie sugeruje, że aby określić liczbę nocy między dniami, użyj:
Następnie możesz określić, czy dwa dni są takie same, używając tej metody i sprawdzając, czy zwraca 0, czy nie.
źródło
Możesz również sprawdzić odstęp czasu między datą, którą masz, a aktualną datą:
W ten sposób uzyskasz odstęp czasu w sekundach między myDate a bieżącą datą / godziną.
Link .
Edycja: Uwaga dla wszystkich: doskonale zdaję sobie sprawę, że [myDate timeIntervalSinceNow] nie określa jednoznacznie, czy myDate jest dzisiaj.
Zostawiam tę odpowiedź tak, jak jest, więc jeśli ktoś szuka czegoś podobnego i [myDate timeIntervalSinceNow] jest przydatne, może to znaleźć tutaj.
źródło
timeIntervalSinceNow
niego odwoływać, ponieważ jest omawiany w wielu innych postach. Również obsługa porównania dni ze sprawdzaniem sekund zachęca do dzielenia podatnego na błędy przez 86400.Swift Extension oparte na najlepszych odpowiedziach:
źródło
Jeśli masz wiele takich porównań dat, wezwania do
calendar:components:fromDate
rozpoczęcia zajmowania dużo czasu. Według niektórych profilów, które zrobiłem, wydają się one dość drogie.Powiedzmy, że próbujesz określić, które z jakiejś tablicy dat, powiedzmy
NSArray *datesToCompare
, są tego samego dnia co jakiś podany dzień, powiedzmyNSDate *baseDate
, a następnie możesz użyć czegoś podobnego do następującego (częściowo zaadaptowanego z powyższej odpowiedzi):Wynik:
źródło
Jest łatwiejszy sposób niż wiele z powyższych odpowiedzi!
źródło
Prawdopodobnie można by to przerobić jako kategorię NSDate, ale użyłem:
(Jednak porównanie dwóch ciągów daty, tak jak w pierwotnym pytaniu, wydaje się prawie „czystsze” ...)
źródło
comps
skoro od razu ustawiasz je na zero? Myślę też, że musisz uwzględnić tę erę.dla iOS7 i wcześniejszych:
źródło
Sprawdź świetną naszą Ericę Sadun
NSDate extension
. Bardzo prosty w użyciu. Dobrze to tutaj:http://github.com/erica/NSDate-Extensions
Jest już w tym poście: https://stackoverflow.com/a/4052798/362310
źródło
Prawidłowe i bezpieczne rozwiązanie bez rozpakowywania na siłę, działające na Swift 2.2 i wcześniejszych iOS 8:
źródło
Oto moja 2-centowa odpowiedź oparta na zaakceptowanej odpowiedzi, ale obsługująca również nowszy interfejs API. Uwaga: używam kalendarza gregoriańskiego, ponieważ większość znaczników czasu to GMT, ale zmieniaj je według własnego uznania
źródło
Moje rozwiązanie polega na obliczeniu liczby dni, które minęły od 1970 roku, przez podzielenie i porównanie części całkowitej
źródło
źródło