Получить массив будущих NSDates - PullRequest
7 голосов
/ 09 декабря 2011

У меня есть сборщик дат.

После выбора времени я хотел бы получить даты следующих 64 понедельников.

Как мне написать метод, чтобы взять дату и вернуть NSArray из NSDates на следующие 64 понедельника с этой даты

например Я выбрал время 6:45 вечера из средства выбора даты, затем я хочу получить следующие 64 понедельника с установленным временем.

Ответы [ 3 ]

3 голосов
/ 10 декабря 2011

Пример (ARC):

NSDate *pickerDate = [NSDate date];
NSLog(@"pickerDate: %@", pickerDate);

NSDateComponents *dateComponents;
NSCalendar *calendar = [NSCalendar currentCalendar];

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:firstMondayOrdinal];
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];

dateComponents = [[NSDateComponents alloc] init];
[dateComponents setWeek:1];

for (int i=0; i<64; i++) {
    [dateComponents setWeek:i];
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
}

Вывод NSLog:
pickerDate: 2011-12-09 20:38:25 +0000
неделя №: 0, понедельникДата: 2011-12-12 20:38:25 +0000
неделя №: 1, понедельникДата: 2011-12-19 20:38:25 +0000
неделя №: 2, понедельникДата: 2011-12-26 20:38:25 +0000
неделя №: 3, понедельникДата: 2012-01-02 20:38:25 +0000
- остальные 60 здесь-

2 голосов
/ 09 декабря 2011

Начните с NSDate из сборщика и продолжайте прибавлять к нему 24 * 60 * 60 секунд до понедельника. Добавьте полученную дату к результату. Продолжайте добавлять 7 * 24 * 60 * 60 секунд к последней добавленной вами дате и помещать результат в список возврата, пока у вас не будет всех 64 понедельников. Вот как вы скажете, если в понедельник выпадет NSDate:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest];
NSInteger weekday = [weekdayComponents weekday];
if (weekday == 2) ... // 2 represents Monday

РЕДАКТИРОВАТЬ: DaveDeLong указал на недостаток вышеуказанного алгоритма: он будет сдвигать время два раза в дни перехода на летнее время. Вместо подсчета секунд вручную используйте этот код, чтобы добавить день к NSDate:

NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1]; // Add 1 when searching for the next Monday; add 7 when iterating 63 times 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
[comps release];
1 голос
/ 09 декабря 2011

Вы можете использовать NSCalendar, чтобы определить, какой сегодня день недели (в выбранное время); поднимите его, чтобы перейти к следующему понедельнику, а затем увеличьте его на 7 дней 63 раза, чтобы получить понедельники, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...