Как получить n-ую воскресную дату месяца в задании c? - PullRequest
4 голосов
/ 20 октября 2011

Как получить дату первого воскресенья или n-го воскресенья или понедельника (любого дня) в кодировке Objective C.

Например: - Я просто хочу, чтобы в моем приложении каждый год отображалась дата дня дружбы.

Но дружба наступает в 1-е воскресенье августа. Итак, дата будет меняться каждый год. здесь мне нужно найти дату первого воскресенья августа каждого года.

есть ли логика, чтобы найти дату n-го воскресенья.

Ответы [ 5 ]

8 голосов
/ 20 октября 2011

Вам необходимо создать объект NSDateComponents и установить соответствующие значения, В вашем примере вы бы сделали:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

dateComponents.year = 2011; // set the current year or whatever year you want here
dateComponents.month = 8;
dateComponents.weekday = 1; // sunday is 1, monday is 2, ...
dateComponents.weekdayOrdinal = 1; // this means, the first of whatever weekday you specified

Чтобы преобразовать это в NSDate-объект, вы просто делаете:

//you may want to use another calendar object here
NSDate *myDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
[dateComponents release]; //don't forget memory management ;)
4 голосов
/ 20 октября 2011

Вы хотите использовать NSDateComponents в сочетании с методом NSCalendar dateFromComponents::

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *c = [[NSDateComponents alloc] init];
[c setYear:2012];
[c setWeekday:1]; // Sunday
[c setWeekdayOrdinal:3]; // The 3rd Sunday

for (int i = 1; i <= 12; i++) {
    [c setMonth:i];
    NSDate *date = [gregorian dateFromComponents:c];
    NSLog(@"Date[%i]: %@",i,date);
}

[c release];
[gregorian release];
1 голос
/ 20 октября 2011

Вот пример. Вы можете найти больше информации в Руководстве по программированию даты и времени .

Чтобы найти первое воскресенье августа:

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setWeekday:1]; // Sunday
[components setWeekdayOrdinal:1]; // The first Sunday in the month
[components setMonth:8]; // August
[components setYear:2011];
NSCalendar *gregorian = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:components];
0 голосов
/ 20 октября 2011

Вы хотите просмотреть NSCalendar класс здесь.

Особый интерес будет представлять метод - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date

0 голосов
/ 20 октября 2011

вы проверяете первый день месяца.

unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorian components:units fromDate:date];

Получите день, используя [компонент дня];<-1 для воскресенья. После этого все просто. </p>

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