Wie kann ich das Jahr / den Monat / den Tag eines NSDate
Objekts ohne weitere Informationen abrufen? Mir ist klar, dass ich das wahrscheinlich mit etwas Ähnlichem machen könnte:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Aber das scheint eine Menge Ärger für etwas so Einfaches wie das Erhalten eines NSDate
Jahres / Monats / Tages zu sein. Gibt es eine andere Lösung?
objective-c
nsdate
nsdatecomponents
nscalendar
Richard J. Ross III
quelle
quelle
Antworten:
Da dies anscheinend meine beliebteste Antwort ist, werde ich versuchen, sie zu bearbeiten, um ein bisschen mehr Informationen zu enthalten.
Trotz seines Namens
NSDate
markiert es an und für sich nur einen Zeitpunkt in der Maschine, kein Datum. Es gibt keine Korrelation zwischen dem durch aNSDate
und 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, dasNSDate
sollte es immer benutzen.NSDate
Zum Glück ist es viel parteiübergreifender.NSCalendar
Wie Sie bereits erwähnt haben, müssen Datum und Uhrzeit ermittelt werden , aber es gibt einen einfacheren Weg, dies zu tun:Dadurch wird
NSDateComponents
aus 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
NSCalendar
Klassenreferenz . Weitere InformationenNSDateComponents
zu finden Sie in derNSDateComponents
Klassenreferenz .Als Referenz ist der Zugriff auf einzelne Komponenten von der
NSDateComponents
ziemlich einfach:Sie müssen nur aufpassen: Sie
NSDateComponents
enthalten 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 dieseNSCalendar
Informationen mitNSCalendarUnit
s versehen).NSDateComponents
enthalten 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öchtenNSDateComponents
, müssen Sie die GeneratormethodeNSCalendar
mit demNSCalendarUnitEra
Flag füttern .quelle
NSCalendar
Die+currentCalendar
Methode gibt den Systemkalender zurück. Wenn das Telefon des Benutzers auf den japanischen oder thailändischen Zeitmodus eingestellt ist, erhalten Sie ein anderes Jahr. Wenn Sie ein bestimmtes Kalendersystem erzwingen möchten, erstellen Sie einen Kalender und initialisieren Sie ihn mit dem richtigen Gebietsschema. Um beispielsweise einen Gregorianischen Kalender zu erzwingen, sollten Sie Folgendes verwenden:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Mit NSDateFormatter können Sie eine separate Komponente eines NSDate abrufen:
Wenn Sie die Monatsnummer anstelle der Abkürzung erhalten möchten, verwenden Sie "MM". Wenn Sie Ganzzahlen erhalten möchten, verwenden Sie
[myDayString intValue];
quelle
Um Itais exzellenten (und funktionierenden!) Code neu zu formulieren, würde eine Beispiel-Hilfsklasse wie folgt aussehen, um den Jahreswert einer bestimmten NSDate-Variablen zurückzugeben.
Wie Sie sehen können, ist es einfach genug, diesen Code zu ändern, um den Monat oder den Tag zu erhalten.
(Ich kann nicht glauben, dass wir 2013 unsere eigenen grundlegenden iOS-Datumsfunktionen wie diese schreiben müssen ...)
Eine andere Sache: Verwenden Sie niemals <und>, um zwei NSDate-Werte zu vergleichen.
XCode akzeptiert diesen Code gerne (ohne Fehler oder Warnungen), aber seine Ergebnisse sind eine Lotterie. Sie müssen die Funktion "Vergleichen" verwenden, um NSDates zu vergleichen:
quelle
In Swift 2.0:
quelle
Ich schreibe diese Antwort, weil es der einzige Ansatz ist, der Ihnen keine
NSDateComponent
Optionen von Variablen zurückgibt und / oder das Entpacken dieser Variablen erzwingt (auch für Swift 3).Swift 3
Swift 2
Bonus Swift 3 lustige Version
quelle
Neu in iOS 8
ObjC
Schnell
quelle
Wenn Sie auf iOS 8+ abzielen, können Sie die neuen
NSCalendar
Komfortmethoden verwenden, um dies in einem knapperen Format zu erreichen.Erstellen Sie zuerst eine
NSCalendar
und verwenden Sie alles, wasNSDate
erforderlich ist.Sie können Komponenten einzeln über extrahieren
component:fromDate:
Oder, noch prägnanter, verwenden Sie
NSInteger
Zeiger übergetEra:year:month:day:fromDate:
Weitere Informationen und Beispiele finden Sie unter NSDate-Manipulation leicht gemacht in iOS 8 . Haftungsausschluss, ich habe den Beitrag geschrieben.
quelle
Ab iOS 8.0 (und OS X 10) können Sie die Komponentenmethode verwenden, um das Abrufen einer einzelnen Datumskomponente wie folgt zu vereinfachen:
Sollte die Dinge einfacher machen und hoffentlich wird dies effizient umgesetzt.
quelle
Wenn Sie die einzelnen NSDateComponents von NSDate erhalten möchten, benötigen Sie auf jeden Fall die von Itai Ferber vorgeschlagene Lösung. Wenn Sie jedoch direkt von NSDate zu einem NSString wechseln möchten, können Sie NSDateFormatter verwenden .
quelle
quelle
Hier ist die Lösung in Swift:
quelle
Versuche dies . . .
Code-Auszug:
Es gibt das aktuelle Jahr, den Monat und das Datum an
quelle
Versuche Folgendes:
quelle
Swift 2.x.
Sie können es als verwenden
Ausgabe
quelle
Schnell
Einfachere Möglichkeit, Datumselemente als optionale Zeichenfolge abzurufen.
quelle
ich mache auf diese Weise ....
quelle
Um eine vom Menschen lesbare Zeichenfolge (Tag, Monat, Jahr) zu erhalten, können Sie Folgendes tun:
quelle