2012-06-13 5 views
3

У меня есть NSDate, например 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 равно 7, а воскресенье - 1.

Это значение интерпретируется в контексте календаря, с которым оно используется - см. «Календари, компоненты даты и единицы календаря» в Руководство по программированию даты и времени.

И если вы посмотрите на NSGregorianCalendar, как и ожидалось, он определит значение 1-7 как воскресенье-субботу.

Calling setFirstWeekday: 2 означает, что ваши недели начинаются в понедельник, для расчета таких вещей, как, например, это вторая неделя месяца и т. Д. Это не значит, что ваши понедельники внезапно становятся воскресеньями. 1 июня 2012 года все еще пятница, а не четверг, поэтому вы получаете 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]; 
} 

убедитесь, что код на дату перехода в следующем году (в том числе простой, если оператор перед циклом)