2012-06-13 46 views
3

我得到了一个N​​SDate,例如1/6 - 12(星期五),并试图找出星期几是星期几。我一周开始于星期一所以周五应该是平日5.NSDateComponents工作日不显示正确的工作日?

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

输出:平日6

不要紧,我设置setFirstWeekday到,输出永远是6 我到底做错了什么?

回答

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

至于NSDateComponents的文件说:

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

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

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

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

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

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

工作日您在哪里找到文档?我花了30分钟搜索到了这一点,并找不到任何明确指出索引的引用。 –

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

一定要的日期跨越到下一个年份代码(包括一个简单的,如果在循环之前声明)