NSCalendar,为什么设置第一个星期不影响计算结果?

我需要计算给定date的工作日,但是,根据日历,星期一可以星期一星期日星期日

所以我想设置它,从星期一开始,使用

[[NSCalendar currentCalendar] setFirstWeekday:2]; 

但是,计算结果是一样的

 { [[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); } 

返回相同的数字,但是为什么?

你看到的行为是正确的。 weekday组件不受firstWeekday属性的影响。 如果你有一个代表星期天的date,那么星期天或星期一开始你的星期将永远是星期天。 这应该会影响您date组件的星期属性中的星期数。

我相信你需要使用ordinalityOfUnit:inUnit:forDate:方法,而不是试图提取date组件。 所以像这样的东西:

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

基本上这个调用要求在给定date的一周( NSWeekCalendarUnit )中的一天( NSWeekCalendarUnit )。

如果这不起作用,则可能需要创build自己的日历,而不是尝试修改currentCalendar上的第一个星期。

例如:

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

然后在ordinalityOfUnit:inUnit:forDate: call中使用新的calendar对象,而不是[NSCalendar currentCalendar]