Как сделать так, чтобы неделя NSCalendar начиналась в понедельник, а не в воскресенье

Когда я пытаюсь сделать так, чтобы текущая дата недели отображалась в журнале (с понедельника по воскресенье), это похоже на то, что неделя начинается с воскресенья. Например: На этой неделе 38. Вчера было 20 сентября. Мой код правильно показывал дни с понедельника по воскресенье. Но сегодня (21 сентября) мой журнал показывает даты следующей недели (неделя 39), когда еще неделя 38.

Мой код:

NSDate *currentDate = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:currentDate];
int thisWeeksNumber = currentComps.weekOfYear;
NSLog(@"1  %d", thisWeeksNumber);

[currentComps setWeekday:2];

NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
NSDate *secondDayOfTheWeek = [self dateByAddingDays:1 toDate:firstDayOfTheWeek];
NSDate *thirdDayOfTheWeek = [self dateByAddingDays:2 toDate:firstDayOfTheWeek];
NSDate *fourthDayOfTheWeek = [self dateByAddingDays:3 toDate:firstDayOfTheWeek];
NSDate *fifthDayOfTheWeek = [self dateByAddingDays:4 toDate:firstDayOfTheWeek];
NSDate *sixthDayOfTheWeek = [self dateByAddingDays:5 toDate:firstDayOfTheWeek];
NSDate *seventhDayOfTheWeek = [self dateByAddingDays:6 toDate:firstDayOfTheWeek];

NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
myDateFormatter.dateFormat = @"yyyy-MM-dd";
NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek];
NSString *secondStr = [myDateFormatter stringFromDate:secondDayOfTheWeek];
NSString *thirdStr = [myDateFormatter stringFromDate:thirdDayOfTheWeek];
NSString *fourthStr = [myDateFormatter stringFromDate:fourthDayOfTheWeek];
NSString *fifthStr = [myDateFormatter stringFromDate:fifthDayOfTheWeek];
NSString *sixthStr = [myDateFormatter stringFromDate:sixthDayOfTheWeek];
NSString *seventhStr = [myDateFormatter stringFromDate:seventhDayOfTheWeek];

NSLog(@"\n %@ \n %@ \n %@ \n %@ \n %@ \n %@ \n %@", firstStr, secondStr, thirdStr, fourthStr, fifthStr, sixthStr, seventhStr);   
}

И мой метод NSDate:

- (NSDate*)dateByAddingDays:(NSInteger)days toDate:(NSDate *)date
{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.day = days;

return [calendar dateByAddingComponents: comps toDate: date options: 0];
}

Это должно отображать неделю 38 все дни, но отображать даты следующей недели, потому что это воскресенье. (когда я пишу это, это 38 неделя и 21 сентября)


person Dridia    schedule 21.09.2014    source источник
comment
[myCalendar setFirstWeekday:1];   -  person danh    schedule 21.09.2014
comment
Я добавил это в свой код, но ничего не произошло. Есть другие идеи?   -  person Dridia    schedule 21.09.2014


Ответы (1)


Вам нужно позвонить setFirstWeekday: со значением параметра NSUInteger 2 (воскресенье - 1)

[myCalendar setFirstWeekday:2];
person Claus Jørgensen    schedule 21.09.2014
comment
Отличная работа. Меня смутило название поста. (который должен читаться как сделать так, чтобы неделя начиналась в понедельник, а не в воскресенье). - person danh; 21.09.2014
comment
Воскресенье также является значением по умолчанию для культуры en-US. (Я не уверен на 100%, когда локализация применяется к NSCalendar) - person Claus Jørgensen; 21.09.2014
comment
Дело в том, что я показываю дни следующей недели, а не текущую неделю (потому что это воскресенье, вчера это работает как шарм!) - person Dridia; 21.09.2014
comment
@Dridia Совершенно непонятно, что вы пытаетесь здесь архивировать. Я рекомендую вам ознакомиться с API: developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ - person Claus Jørgensen; 21.09.2014
comment
Приведенный выше код показывает неделю 39 все дни, с понедельника по воскресенье, когда текущая неделя равна 38. Дело в том, что когда воскресенье (например, сегодня), код думает, что это новая неделя, и показывает мне понедельник-воскресенье для недели 39, когда это неделя 38. Я попробовал приведенный выше код вчера (в субботу), и он работал нормально. он показывал дни недели 38, а НЕ 39. - person Dridia; 21.09.2014
comment
Первый день недели, а вместе с ним и номер недели, зависят от локали. Вы получаете разные результаты в США и Великобритании. Это потому, что на самом деле наступила другая неделя. - person gnasher729; 22.01.2015