Ändern NSDate darzustellen 1 Monat ab heute
-
06-07-2019 - |
Frage
Ich füge Ereignisse in eine Cocoa-Anwendung zu wiederholen Ich arbeite an. Ich habe jeden Tag und Woche in Ordnung wiederholen, weil ich diese mathematisch definieren (3600 * 24 * 7 = 1 Woche). Ich verwende den folgenden Code, um das Datum zu ändern:
[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]
Ich weiß, wie viele Monate sind vergangen, seit dem Ereignis wiederholt wurde, aber ich kann nicht herausfinden, wie ein NSDate Objekt zu machen, die 1 Monat / 3 Monate / 6 Monate / 9 Monate in die Zukunft darstellt. Im Idealfall möchte ich den Benutzer monatlich sagen, wiederholt Oktober beginnend 14, und es wird den 14. eines jeden Monats wiederholen.
Lösung
(fast die gleiche wie diese Frage .)
Von der Dokumentation :
Die Verwendung von NSCalendarDate stark entmutigt. Es ist noch nicht veraltet, jedoch kann es in den nächsten Haupt OS sein freigeben, nachdem Mac OS X v10.5. Zum kalendarischen Berechnungen, sollten Sie Verwendung geeignete Kombinationen von NSCalendar, NSDate und NSDateComponents, wie beschrieben in Kalender in Daten und Zeiten Programmierung Themen für Cocoa .
Im Anschluss an diese Beratung:
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];
NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth];
NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today];
nextMonthComponents.day = todayDayComponents.day;
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];
[gregorian release];
Es kann eine direkte oder effiziente Implementierung sein, aber dies sollte genau sein und in der richtigen Richtung weisen soll.
Andere Tipps
Mit NSCalender, NSDateComponents und NSDate:
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];
Sie die unterschiedlichen Eigenschaften von components
auf verschiedene Zeiträume (beispielsweise 3 Monate, 6 Monate usw.) zu erhalten.
Hinweis: Je nach Kontext, können Sie [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]
statt [NSCalendar currentCalendar]
verwenden, wenn sie von „1 Monat“ Sie „1 Monat auf dem Gregorianischen Kalender“ bedeuten
Ich werde wahrscheinlich NSCalendarDate verwenden.
Erhalten Sie aktuelles Datum des TagDesMonats, MonthOfYear und yearOfCommonEra, als drei Zahlen.
Fügen Sie die erforderliche Anzahl von Monaten (1/3/6/9), kümmert sich um 1), ob das Datum existieren (zB 31. April, 29. Februar auf einem Nicht-Schaltjahr), und 2) Prolongation Jahr.
Erstellen Sie diesen neuen Termin mit NSCalendarDate des initWithYear: Monat: Tag: Stunde: Minute: Sekunde: Zeitzone:
NSCalendarDate wird nicht mehr durch neue SDK unterstützt wird, werden Probleme haben, während für den Vertrieb aufzubauen.
Sie können wie die unten tun:
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];
NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:nextMonth];
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];
[gregorian release];