2013-06-01 52 views
5

我需要計算工作日給定日期,但是,根據在日曆上一個星期能星在週一和somwhere週日NSCalendar,爲什麼設置第一個週日不影響計算結果?

所以我想設置它,開始於週一,使用

[[NSCalendar currentCalendar] setFirstWeekday:2]; 

然而,計算的結果是一樣的

{ 
    [[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); 
} 

返回相同的數字,但是爲什麼呢?

回答

8

您看到的行爲是正確的。 weekday組件不受firstweekday屬性的影響。如果你有一個代表星期日的日期,那麼星期天或星期一開始你的星期將永遠是星期天。這應該會影響您日期組件的星期屬性中的星期數。

+0

所以週日永遠是週日0,無論第一個週日點是什麼? –

+5

週日永遠是1 – Sven

+3

週日1,週一2,週二3,週三4,週五5,週六6 –

3

我相信你需要使用ordinalityOfUnit:inUnit:forDate:方法,而不是試圖提取日期組件。因此,像這樣:

NSUInteger weekday = [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date]; 

基本上是呼叫請求在本週(NSWeekCalendarUnit)天(NSWeekdayCalendarUnit)給定日期。

如果這樣做不起作用,您可能需要創建自己的日曆,而不是嘗試修改currentCalendar上的第一個星期。

例如:

NSCalendarIdentifier calendarIdentifier = [[NSCalendar currentCalendar] calendarIdentifier]; 
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier] autorelease]; 
[calendar setFirstWeekday:2]; 

然後使用新的calendar對象,而不是[NSCalendar currentCalendar]ordinalityOfUnit:inUnit:forDate:通話。

+0

NSWeekCalendarUnit已棄用:/ –

+0

也許嘗試其他星期單位之一:'NSWeekOfMonthCalendarUnit'或'NSWeekOfYearCalendarUnit'。在這種情況下,他們沒有任何意義,但值得嘗試。 –

+1

在iOS 10上setFirstWeekday:2不會改變任何東西...... – Dmitry

相關問題