Pet*_*isu 6 cocoa nsdate nscalendar ios
我需要计算给定日期的工作日,但是,根据日历,一周可以在星期一加星,在星期日看星期日
所以我想设置它,从周一开始,使用
[[NSCalendar currentCalendar] setFirstWeekday:2];
Run Code Online (Sandbox Code Playgroud)
但是,计算结果是一样的
{
[[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);
}
Run Code Online (Sandbox Code Playgroud)
返回相同的数字,但为什么?
你看到的行为是正确的.工作日组件不受第一周天属性的影响.如果你有一个代表星期日的日期,你将在星期天或星期一开始你的一周,这将是一个星期天.这应该影响的是日期组件的周属性中的周数.
我相信您需要使用该ordinalityOfUnit:inUnit:forDate:方法而不是尝试提取日期组件。所以像这样:
NSUInteger weekday = [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
Run Code Online (Sandbox Code Playgroud)
基本上,该调用是询问给定日期NSWeekdayCalendarUnit的周 ( NSWeekCalendarUnit) 中的天 ( ) 。
如果这不起作用,您可能需要创建自己的日历,而不是尝试修改currentCalendar.
例如:
NSCalendarIdentifier calendarIdentifier = [[NSCalendar currentCalendar] calendarIdentifier];
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier] autorelease];
[calendar setFirstWeekday:2];
Run Code Online (Sandbox Code Playgroud)
然后使用那个新calendar对象而不是[NSCalendar currentCalendar]在ordinalityOfUnit:inUnit:forDate:调用中。