Da dies anscheinend meine beliebteste Antwort ist, werde ich versuchen, sie zu bearbeiten, um ein bisschen mehr Informationen zu enthalten.
Trotz seines Namens NSDatemarkiert es an und für sich nur einen Zeitpunkt in der Maschine, kein Datum. Es gibt keine Korrelation zwischen dem durch a NSDateund einem Jahr, Monat oder Tag angegebenen Zeitpunkt . Dafür müssen Sie sich auf einen Kalender beziehen. Jeder gegebene Zeitpunkt gibt unterschiedliche Datumsinformationen zurück, je nachdem, welchen Kalender Sie betrachten (Datumsangaben sind beispielsweise im gregorianischen und im jüdischen Kalender nicht gleich), und während der gregorianische Kalender der am häufigsten verwendete Kalender im Kalender ist Welt - ich nehme an - wir sind ein wenig voreingenommen, das NSDatesollte es immer benutzen. NSDateZum Glück ist es viel parteiübergreifender.
NSCalendarWie Sie bereits erwähnt haben, müssen Datum und Uhrzeit ermittelt werden , aber es gibt einen einfacheren Weg, dies zu tun:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Dadurch wird NSDateComponentsaus dem aktuellen Systemkalender für den aktuellen Tag ein Objekt generiert , das Tag, Monat und Jahr enthält. ( Hinweis: Dies ist nicht unbedingt der aktuelle benutzerdefinierte Kalender, sondern nur der Standardsystemkalender.)
Wenn Sie einen anderen Kalender oder ein anderes Datum verwenden, können Sie dies natürlich leicht ändern. Eine Liste der verfügbaren Kalender und Kalendereinheiten finden Sie in der NSCalendarKlassenreferenz . Weitere Informationen NSDateComponentszu finden Sie in der NSDateComponentsKlassenreferenz .
Als Referenz ist der Zugriff auf einzelne Komponenten von der NSDateComponentsziemlich einfach:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Sie müssen nur aufpassen: Sie NSDateComponentsenthalten keine gültigen Informationen für Felder, nach denen Sie fragen, es sei denn, Sie haben sie mit diesen gültigen Informationen generiert (dh Sie müssen diese NSCalendarInformationen mit NSCalendarUnits versehen). NSDateComponentsenthalten keine Referenzinformationen an und für sich - es handelt sich lediglich um einfache Strukturen, die Nummern enthalten, auf die Sie zugreifen können. Wenn Sie beispielsweise auch eine Ära beenden möchten NSDateComponents, müssen Sie die Generatormethode NSCalendarmit dem NSCalendarUnitEraFlag füttern .