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.

War es hilfreich?

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]; 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top