工作日的NSDateComponents没有显示正确的工作日?

时间:2012-06-13 17:00:10

标签: objective-c ios ios5 nsdate nsdatecomponents

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

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

输出:工作日6

无论我将setFirstWeekday设置为什么,输出将始终为6。 我做错了什么?

3 个答案:

答案 0 :(得分:9)

尝试做这样的事情:

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);

答案 1 :(得分:6)

正如NSDateComponents的文档所说:

  

工作日单位是数字1到n,其中n是一周中的天数。例如,在公历中,n为7,星期日由1表示。

     

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

如果按照预期观察NSGregorianCalendar,它会将1-7的含义定义为周日至周六。

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

如果您想知道从一周开始的那几天,而不是工作日,这很容易:

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

答案 2 :(得分:3)

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];
}

请务必为下一年的日期交叉编码(在循环之前包含简单的if语句)