Ponieważ jest to najwyraźniej moja najpopularniejsza odpowiedź, spróbuję ją edytować, aby zawierała nieco więcej informacji.
Pomimo swojej nazwy, NSDate
sama w sobie oznacza po prostu punkt w czasie maszyny, a nie datę. Nie ma korelacji między punktem w czasie określonym przez NSDate
a 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 NSDate
zawsze powinniśmy go używać. NSDate
, na szczęście jest o wiele bardziej dwustronny.
Jak NSCalendar
wspomniał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 NSDateComponents
obiekt 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 NSCalendar
Odniesieniu do klasy . Więcej informacji na temat NSDateComponents
można znaleźć w NSDateComponents
Odwołaniu do klasy .
Dla porównania, dostęp do poszczególnych komponentów z NSDateComponents
jest raczej łatwy:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Musisz tylko uważać: NSDateComponents
nie 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ą NSCalendar
o przekazanie tych informacji NSCalendarUnit
). NSDateComponents
same 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 NSCalendar
z NSCalendarUnitEra
flagą.