2013-06-01 35 views
5

tôi cần phải tính toán các ngày trong tuần cho một ngày nhất định, tuy nhiên, tùy thuộc vào lịch một tuần có thể sao vào thứ hai và somwhere vào chủ nhậtNSCalendar, tại sao cài đặt the FirstWeekday không ảnh hưởng đến kết quả tính toán?

vì vậy tôi muốn thiết lập nó, để bắt đầu vào thứ hai, sử dụng

[[NSCalendar currentCalendar] setFirstWeekday:2]; 

Tuy nhiên, kết quả tính toán là như nhau

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

lợi nhuận cùng số, nhưng tại sao?

Trả lời

8

Hành vi bạn thấy là chính xác. Thành phần ngày trong tuần không bị ảnh hưởng bởi thuộc tính firstWeekday. Nếu bạn có một ngày đại diện cho một chủ nhật nó sẽ luôn luôn là một chủ nhật bạn bắt đầu tuần của bạn vào chủ nhật đó hoặc vào thứ hai. Điều này sẽ ảnh hưởng đến số tuần trong thuộc tính tuần của các thành phần ngày của bạn.

+0

vì vậy Chủ nhật sẽ luôn là ngày trong tuần 0, bất kể điểm đầu tiên của ngày nào? –

+5

Chủ nhật luôn là – Sven

+3

Chủ Nhật 1, Thứ Hai 2, Thứ Ba 3, Thứ Tư 4, Thứ Sáu 5, Thứ Bảy 6 –

3

Tôi tin rằng bạn cần sử dụng phương thức ordinalityOfUnit:inUnit:forDate: thay vì cố gắng trích xuất các thành phần ngày. Vì vậy, một cái gì đó như thế này:

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

Về cơ bản gọi đó là yêu cầu trong ngày (NSWeekdayCalendarUnit) trong tuần (NSWeekCalendarUnit) cho ngày cụ thể.

Nếu điều đó không hoạt động, bạn có thể cần phải tạo lịch của riêng mình, thay vì cố sửa đổi ngày đầu tiên trong tuần trên currentCalendar.

Ví dụ:

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

Sau đó sử dụng mà đối tượng mới calendar hơn [NSCalendar currentCalendar] trong ordinalityOfUnit:inUnit:forDate: gọi.

+0

NSWeekCalendarUnit không được dùng nữa:/ –

+0

Có thể thử một trong các đơn vị tuần khác: 'NSWeekOfMonthCalendarUnit' hoặc' NSWeekOfYearCalendarUnit'. Họ không thực sự có ý nghĩa trong bối cảnh này, nhưng nó có giá trị cố gắng. –

+1

Trên iOS 10 setFirstWeekday: 2 không thay đổi bất cứ điều gì ... – Dmitry

Các vấn đề liên quan