NSCalendar, pourquoi la définition de firstWeekday n'affecte pas le résultat du calcul?

J'ai besoin de calculer le jour de la semaine pour une date donnée, cependant, selon le calendar une semaine peut être le lundi et quelque part le dimanche

donc je voulais le régler, pour commencer lundi, en utilisant

[[NSCalendar currentCalendar] setFirstWeekday:2]; 

Cependant, le résultat du calcul est le même

 { [[NSCalendar currentCalendar] setFirstWeekday:1]; NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date]; NSInteger weekday = [weekdayComponents weekday] - 1; NSLog(@"%d", weekday); } { [[NSCalendar currentCalendar] setFirstWeekday:2]; NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date]; NSInteger weekday = [weekdayComponents weekday] - 1; NSLog(@"%d", weekday); } 

returnne les mêmes numbers, mais pourquoi?

Le comportement que vous voyez est correct. Le composant de jour de la semaine n'est pas affecté par la propriété firstWeekday. Si vous avez une date qui représente un dimanche, ce sera toujours un dimanche que vous commenciez votre semaine le dimanche ou le lundi. Ce que cela devrait affecter est le numéro de semaine dans la propriété week de vos composants de date.

Je crois que vous devez utiliser la ordinalityOfUnit:inUnit:forDate: plutôt que d'essayer d'extraire les composants de date. Donc, quelque chose comme ça:

 NSUInteger weekday = [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date]; 

Fondamentalement, cet appel request le jour ( NSWeekdayCalendarUnit ) dans la semaine ( NSWeekCalendarUnit ) pour la date donnée.

Si cela ne fonctionne pas tel quel, vous devrez peut-être créer votre propre calendar, plutôt que d'essayer de modifier le premier jour de la semaine sur le calendar actuel.

Par exemple:

 NSCalendarIdentifier calendarIdentifier = [[NSCalendar currentCalendar] calendarIdentifier]; NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier] autorelease]; [calendar setFirstWeekday:2]; 

Utilisez ensuite ce nouvel object de calendar plutôt que [NSCalendar currentCalendar] dans l' ordinalityOfUnit:inUnit:forDate: call.