2010-11-15 6 views
1

J'espère que c'est juste une courbe d'apprentissage que je traverse.NSDate obtenir un jour spécifique de la semaine?

Je crée une date arbitraire. Je veux trouver le samedi suivant le troisième vendredi.

NSLog(@"Date: %@", [date description]); 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"EST"]; 
    [calendar setTimeZone:zone]; 
    NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; 
    [components setWeekday:6];  // 1 = Sunday ... 7 = Saturday 
    [components setWeekdayOrdinal:3]; // 3rd Friday 
    resultDate = [calendar dateFromComponents:components]; 
    NSLog(@"Date: %@", [resultDate description]); 

Et la sortie:

Date: 2010-11-01 05:00:00 GMT

Date: 2010-11-01 05:00:00 GMT

Pourquoi ? Comment puis-je réparer cela?

+1

À l'avenir, ne mettez pas des choses telles que « Je déteste insertTechnology ici » – Woot4Moo

+0

Il était le sarcasme - il est évident que je dois en apprendre davantage à ce sujet afin d'être habitué. Comme le dit la déclaration suivante: «J'espère que ce n'est qu'une courbe d'apprentissage que je traverse. –

Répondre

2

Modifier les composants:

(NSWeekdayCalendarUnit | NSYearCalendarUnit) 

Cela fonctionne:

NSDate *today = [[NSDate alloc] init]; 
NSLog([today description]); 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *weekdayComponents = [gregorian components:(NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:today]; 

NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init]; 
[componentsToSubtract setDay: 0 - ([weekdayComponents weekday])]; 
[componentsToSubtract setWeekdayOrdinal:([weekdayComponents weekday] <= 6) ? 3 : 4]; 
//[componentsToSubtract setWeekdayOrdinal:3]; //old way - not perfect 

NSDate *saturday = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0]; 
NSDateComponents *components = 
[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
    fromDate: saturday]; 
saturday = [gregorian dateFromComponents:components]; 

NSLog([saturday description]); 

Hope this helps.

+0

Cela ne semble pas le faire. Ma sortie après le changement est: Date: 2010-11-01 05:00:00 GMT, Date: 2010-01-15 05:00:00 GMT. Cela va au premier mois de l'année. –

+0

Voir ma modification. J'ai trouvé la solution. (Parties provenant de: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html%23//apple_ref/doc/uid/TP40007836-SW1) –

+0

Oui, cette travaux. Je ne comprends pas la soustraction bien. Je vais continuer à lire ... –

4
// Sunday = 1, Saturday = 7 

int weekday = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate: date] weekday]; 
Questions connexes