2010-03-25 12 views
3

Ceci est un peu étrange, mais est-il possible d'utiliser un NSCalendar (ou n'importe quel composant, d'ailleurs) pour comprendre quelle est la date du prochain "premier mardi du mois "serait? Par exemple, aujourd'hui c'est le jeudi 25 mars 2010. Le prochain "premier mardi du mois" serait le 6 avril. De même, si je cherchais le prochain "premier mardi du mois" le 1er avril, ce serait toujours le 6 avril.Travailler avec NSCalendar - obtenir le premier mardi suivant d'un mois

Comment le feriez-vous?

Merci beaucoup !!!!!

Répondre

4

Le code calcule ci-dessous le premier mardi d'un donnée mois/année combinaison. Il est écrit en MacRuby parce que c'est ce que je viens de l'essayer, mais vous ne devriez pas avoir de problème pour le convertir en Objective-C, c'est juste une syntaxe différente (j'adore MacRuby pour essayer rapidement une idée):

dc = NSDateComponents.alloc.init 
# Set month to April 2010 
dc.setYear 2010 
dc.setMonth 4 

dc.setWeekday 3 # 1 = Sunday, 2 = Monday, ... 
dc.setWeekdayOrdinal 1 # We want the first weekday of the month 

cal = NSCalendar.alloc.initWithCalendarIdentifier NSGregorianCalendar 
date = cal.dateFromComponents dc 
date.description # => "2010-04-06 00:00:00 +0200" 

Je vous laisse le soin de déterminer le "premier mardi suivant" à partir d'une date donnée: faites d'abord le calcul du mois de la date actuelle et si le résultat est passé, refaites le mois suivant. Utilisez -[NSCalendar components:fromDate:] pour obtenir le combo mois/jour d'un NSDate donné.

+0

simplement fantastique! –

1

Malheureusement, je ne peux pas vérifier l'incapacité de ce code, mais certains devraient ressembler à ceci:

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setWeekday:2]; // Monday 
[components setMonth:5]; // May 
[components setYear:2008]; 
[components setWeekdayOrdinal:1] 
NSCalendar *gregorian = [[NSCalendar alloc] 
         initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [gregorian dateFromComponents:components]; 

Pour les échantillons et les informations détaillées voir ce guide

+0

Merci, mais cela ne fait que coder dur une date. Je dois être en mesure de comprendre dynamiquement ce que la date que je cherche est ... –

+0

Oui bien sûr. Ceci est juste un exemple :-) – Victor

+1

Cela ne fonctionnera pas. Vous devez inclure '[composants setWeekdayOrdinal: 1];'. –