Отображение текущих дней недели и даты

У меня небольшая проблема. Я хочу, чтобы я отображал все дни с датой на текущей неделе (поскольку я пишу, это 38-я неделя (по григорианскому календарю)). То, что у меня есть, хорошо, но оно не отображает правильные дни. Например: на этой неделе понедельник 15 сентября, а воскресенье 21 сентября. Когда я устанавливаю первый день недели, он устанавливает его как воскресенье 14 сентября.

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); //This displays the correct week.

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

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

Это должно отображать с 15 сентября по 21 сентября, но отображает с 14 сентября (воскресенье) по 21 сентября (суббота).

Заранее спасибо!


person Dridia    schedule 20.09.2014    source источник


Ответы (1)


Если вы проверите документацию, она делает именно то, что должна делать:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDateComponents/setWeekday:

Когда вы звоните setWeekDay - 1 означает воскресенье, поэтому, если вам нужно начать с понедельника, ваш первый звонок должен быть setWeekDay:2

Обновлять:

Что касается перехода и получения всех последовательных дней после первого, я бы предложил реализовать что-то подобное (вставьте эту функцию в свой код):

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

И используйте эту функцию, чтобы добавить 1-6 со дня начала вашей недели. В основном замена всего кода второго и других дней:

[currentComps setWeekday:2];
NSDate *secondDayOfTheWeek = [myCalendar dateFromComponents:currentComps];

со следующим:

NSDate *secondDayOfTheWeek = [self dateByAddingDays:1 toDate:firstDayOfTheWeek];
NSDate *thirdOfTheWeek = [self dateByAddingDays:2 toDate:firstDayOfTheWeek];
... 
person sha    schedule 20.09.2014
comment
Да, я пробовал это. Но как мне получить воскресенье 21 сентября? Потому что неделя не начинается с воскресенья. - person Dridia; 20.09.2014
comment
Я понятия не имею, как мне реализовать это в моем коде. - person Dridia; 20.09.2014
comment
@Dridia: я добавил точный код, который вам нужно скопировать и вставить в ваш код. - person sha; 20.09.2014
comment
Я понятия не имею, как ты это сделала @sha ! Но я работаю как шарм! Большое спасибо!! - person Dridia; 20.09.2014
comment
Сегодня (воскресенье) Этот код выполняется в следующие дни недели. Итак, сегодня еще 38-я неделя, но он отображает все даты 39-й недели. Почему это так? - person Dridia; 21.09.2014