Ponieważ jest to najwyraźniej moja najpopularniejsza odpowiedź, spróbuję ją edytować, aby zawierała nieco więcej informacji.
Pomimo swojej nazwy, NSDatesama w sobie oznacza po prostu punkt w czasie maszyny, a nie datę. Nie ma korelacji między punktem w czasie określonym przez NSDatea rok, miesiąc lub dzień. W tym celu musisz odwołać się do kalendarza. Dowolny moment zwróci informacje o różnych datach w oparciu o kalendarz, na który patrzysz (daty nie są takie same, na przykład w kalendarzu gregoriańskim i żydowskim), a kalendarz gregoriański jest najczęściej używanym kalendarzem w świat - zakładam - jesteśmy trochę stronniczy, że NSDatezawsze powinniśmy go używać. NSDate, na szczęście jest o wiele bardziej dwustronny.
Jak NSCalendarwspomniałeś, uzyskanie daty i godziny będzie musiało upłynąć , ale jest na to prostszy sposób:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
To generuje NSDateComponentsobiekt zawierający dzień, miesiąc i rok z bieżącego kalendarza systemowego dla bieżącego dnia. ( Uwaga: niekoniecznie jest to bieżący kalendarz określony przez użytkownika , tylko domyślny kalendarz systemowy).
Oczywiście, jeśli używasz innego kalendarza lub daty, możesz to łatwo zmienić. Lista dostępnych kalendarzy i jednostek kalendarza znajduje się w NSCalendarOdniesieniu do klasy . Więcej informacji na temat NSDateComponentsmożna znaleźć w NSDateComponentsOdwołaniu do klasy .
Dla porównania, dostęp do poszczególnych komponentów z NSDateComponentsjest raczej łatwy:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Musisz tylko uważać: NSDateComponentsnie będzie zawierał prawidłowych informacji dla pól, o które prosisz, chyba że wygenerowałeś je z tymi prawidłowymi informacjami (tj. Prośbą NSCalendaro przekazanie tych informacji NSCalendarUnit). NSDateComponentssame w sobie nie zawierają żadnych informacji referencyjnych - są to po prostu proste struktury, które przechowują liczby, do których masz dostęp. Jeśli chcesz również uzyskać erę, na przykład, z NSDateComponents, będziesz musiał karmić metodę z generatora NSCalendarz NSCalendarUnitEraflagą.