NSDateComponents工作日不显示正确的工作日?

我得到了一个N​​SDate例如1/6 – 12(星期五),并试图找出它是什么工作日。 我的星期一从星期一开始,星期五应该是星期五。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [calendar setFirstWeekday:2]; NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:firstOfJulyDate]; NSLog(@"weekday %i",components.weekday); 

输出:工作日6

无论我设置setFirstWeekday什么,输出将永远是6.我做错了什么?

尝试做这样的事情:

 NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; [gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7 NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]]; NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal); 

正如NSDateComponents的文档所述:

平日单位是数字1到n,其中n是一周中的天数。 例如,在公历中,n是7,星期天是1。

此值在使用日历的上下文中进行解释 – 请参阅“date和时间编程指南”中的“日历,date组件和日历单位”。

如果你看NSGregorianCalendar,如预期的那样,它将1-7的意思定义为星期六至星期六。

调用setFirstWeekday:2意味着你的星期一从星期一开始计算,比如这是否是这个月的第二周,等等。这并不意味着你的星期一突然变成了星期天。 2012年6月1日仍然是星期五,不是星期四,所以你得到6,而不是5。

如果不是星期几,你想知道从一周开始有多less天,这很简单:

 (components.weekday - calendar.firstWeekday + 1) % 7 

NSDateComponents不会自动同步所有组件,例如:

 NSDate *date = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *component = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSWeekdayCalendarUnit fromDate:date]; currentMonth = component.month; // printing the next 3 month's start dates MUST have the setYear! for (int i = currentMonth; i < currentMonth + 3; i++) { [components setDay:1]; [components setMonth:i]; [components setYear:2014]; NSDate *newDate = [calendar dateFromComponents:components]; NSDateComponents *components2 = [calendar components:NSDayCalendarUnit |NSMonthCalendarUnit | NSWeekdayCalendarUnit fromDate:newDate]; monthInt = [components2 month]; weekIndex = [components2 weekday]; } 

一定要编码进入下一年的date(在循环之前包括一个简单的if语句)