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

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)

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

Sve*_*ven 9

你看到的行为是正确的.工作日组件不受第一周天属性的影响.如果你有一个代表星期日的日期,你将在星期天或星期一开始你的一周,这将是一个星期天.这应该影响的是日期组件的周属性中的周数.

  • @Peter Lapisu别忘了Thur!:-) (15认同)
  • 星期天永远是1 (6认同)
  • 周日1,周一2,周二3,周三4,周五5,周六6 (3认同)
  • 具体来说,NSCalendar的`firstWeekDay`只会影响`NSDateComponents`的'weekOfMonth/weekOfYear/yearForWeekOfYear`属性.顺便说一句,NSCalendar的`week`属性已被弃用,并由`weekOfMonth`和`weekOfYear`代替. (2认同)

Jam*_*ess 5

我相信您需要使用该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:调用中。