NSCalendar
предоставляет гораздо более простой способ сделать это:
NSDate *birthday = ...; // the birthday
NSDate *today = [NSDate date];
NSCalendar *c = [NSCalendar currentCalendar];
NSInteger birthdayDayOfYear = [c ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:birthday];
NSInteger todayDayOfYear = [c ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:today];
NSInteger different = birthdayDayOfYear - todayDayOfYear;
По сути, мы выясняем, насколько далеко зашли сегодняшний год и целевая дата (т. Е. Сегодня [5 июня])156-й день года), а затем вычтите их, чтобы выяснить, сколько дней между ними.
Этот метод, конечно, основан на предположении, что целевая дата находится в том же году, что итекущая дата.Я думаю, что было бы довольно легко обойти это, однако.
Другой, еще более простой способ сделать это, который будет учитывать многолетние различия, выглядит так:
NSDateComponents *d = [[NSCalendar currentCalendar] components:NSDayCalendarUnit fromDate:today toDate:birthday options:0];
NSInteger difference = [d day];
Если вам нужно убедиться, что день рождения в будущем, это также легко сделать:
NSDateComponents *year = [[[NSDateComponents alloc] init] autorelease];
NSInteger yearDiff = 1;
NSDate *newBirthday = birthday;
while([newBirthday earlierDate:today] == newBirthday) {
[year setYear:yearDiff++];
newBirthday = [[NSCalendar currentCalendar] dateByAddingComponents:year toDate:birthday options:0];
}
//continue on with the 2-line calculation above, using "newBirthday" instead.
update Я обновил цикл выше, чтобы всегда увеличиватьот первоначальной даты n лет, а не год за годом.Если кто-то родится 29 февраля, увеличение на один год приведет к 1 марта, что было бы неправильно, если бы вы снова попали в високосный год.Прыгая с первоначальной даты каждый раз, у нас нет этой проблемы.