Question

J'ajoute des événements répétitifs à une application Cocoa sur laquelle je travaille. Je répète tous les jours et toutes les semaines car je peux les définir mathématiquement (3600 * 24 * 7 = 1 semaine). J'utilise le code suivant pour modifier la date:

[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]

Je sais combien de mois se sont écoulés depuis la répétition de l'événement, mais je ne vois pas comment créer un objet NSDate représentant un mois / 3 mois / 6 mois / 9 mois dans le futur. Dans l’idéal, je veux que l’utilisateur dise répète tous les mois à compter du 14 octobre et le 14 de chaque mois.

Était-ce utile?

La solution

(Presque identique à cette question .)

Extrait de la documentation . :

  

Utilisation de NSCalendarDate fortement   découragé. Il n'est pas encore déconseillé,   mais il peut être dans le prochain OS majeur   Communiqué après Mac OS X v10.5. Pour   calculs calendaires, vous devriez   utiliser des combinaisons appropriées de   NSCalendar, NSDate et   NSDateComponents, comme décrit dans   Calendriers dans Dates et heures   Thèmes de programmation pour le cacao .

En suivant ce conseil:

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];

Il se peut que la mise en œuvre soit plus directe ou plus efficace, mais elle devrait être précise et indiquer la bonne direction.

Autres conseils

Utilisez NSCalender, NSDateComponents et NSDate:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

Il suffit de définir les différentes propriétés des composants pour obtenir des périodes différentes (par exemple, 3 mois, 6 mois, etc.).

Remarque: En fonction du contexte, vous pouvez utiliser [[[[NSCalendar alloc]] initWithCalendarIdentifier: NSGregorianCalendar] autorelease] au lieu de [NSCalendar currentCalendar] , si par " 1 mois " vous voulez dire "1 mois dans le calendrier grégorien".

Je vais probablement utiliser NSCalendarDate.

Obtenez trois jours pour le jour du mois, le mois de l’année et l’année du mois d’année, sous forme de trois chiffres.

Ajoutez le nombre de mois requis (le 1/3/6/9), en prenant en compte 1) l’existence de cette date (par exemple, les 31 avril et 29 février), et 2) le report de année.

Créez cette nouvelle date avec initWithYear de NSCalendarDate: mois: jour: heure: minute: seconde: timeZone:

NSCalendarDate n'est plus pris en charge par le nouveau SDK. Un problème sera rencontré lors de la création de la distribution.

Vous pouvez faire comme ci-dessous:

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]; 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top