День рождения моего контакта в ближайшие 10 дней - PullRequest
1 голос
/ 24 апреля 2011

Я пытаюсь вычислить, будет ли у любого из контактов моей адресной книги день рождения в ближайшие 10 дней.Есть много кода для сравнения дат, но я хочу сравнить только день и месяц.Например, если контакт родился 01.05.1960 г. (а предположим, что сегодня 24.04.2011 г.), я хочу подсчитать, что до его дня рождения осталось всего шесть дней.Помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 24 апреля 2011

Измените день рождения на этот год (или на следующий год, если день рождения был уже в этом году) и рассчитайте с помощью NSDateComponents и NSCalendar.

Выглядит немного сложно, но вы можете сделать это так:

NSDate *birthDay = ... // [calendar dateFromComponents:myBirthDay];

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDateComponents *thisYearComponents = [calendar components:NSYearCalendarUnit fromDate:[NSDate date]];
NSDateComponents *birthDayComponents = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:birthDay];
[birthDayComponents setYear:[thisYearComponents year]];

NSDate *birthDayThisYear = [calendar dateFromComponents:birthDayComponents];

NSDateComponents *difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
if ([difference day] < 0) {
    // this years birthday is already over. calculate distance to next years birthday
    [birthDayComponents setYear:[thisYearComponents year]+1];
    birthDayThisYear = [calendar dateFromComponents:birthDayComponents];
    difference = [calendar components:NSDayCalendarUnit fromDate:[NSDate date] toDate:birthDayThisYear options:0];
}


NSLog(@"%i days until birthday", [difference day]);
0 голосов
/ 24 апреля 2011

Используйте приведенную ниже функцию NSDate с вашим контактом NSDate.

- (NSTimeInterval)timeIntervalSinceNow

Данная функция возвращает интервал между получателем и текущей датой и временем.

   NSTimeInterval interval = [date1 timeIntervalSinceNow:myContactDate];

NSTimeInterval - истекшее время в секундах (выраженное числом с плавающей запятой). Затем вы можете поделить на 86400, то есть количество секунд в дне и округлить до ближайшего целого числа.

NSInteger days = interval / 86400;

Теперь у вас есть количество дней ...

РЕДАКТИРОВАНИЕ:

Вы также можете использовать NSCalendar и NSDateComponents, чтобы получить компонент дня только между двумя датами.

- (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

Используйте приведенный ниже код для справки. ( Взято из документации Apple для NSCalendar )

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *startDate = ...;
    NSDate *endDate = ...;
    unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

    NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate  toDate:endDate  options:0];
    int months = [comps month];
    int days = [comps day];
0 голосов
/ 24 апреля 2011

После получения даты рождения вашего контакта:

ABAddressBook получить свойство на день рождения

вам нужно настроить компонент года:

NSDate - Изменение значения года

Затем вы можете вычислить количество дней до ее дня рождения:

NSDate обратный отсчет в днях

...