Say that you have an NSDate and you want a NSString describing the age according to that date.
Here is a method that may be can help you:
- (NSString *)age:(NSDate *)dateOfBirth { NSInteger years; NSInteger months; NSInteger days; NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]]; NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth]; if (([dateComponentsNow month] < [dateComponentsBirth month]) || (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) { years = [dateComponentsNow year] - [dateComponentsBirth year] - 1; } else { years = [dateComponentsNow year] - [dateComponentsBirth year]; } NSLog(@"years:%d", years); if ([dateComponentsNow year] == [dateComponentsBirth year]) { months = [dateComponentsNow month] - [dateComponentsBirth month]; } else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] > [dateComponentsBirth month]) { months = [dateComponentsNow month] - [dateComponentsBirth month]; } else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] < [dateComponentsBirth month]) { months = [dateComponentsNow month] - [dateComponentsBirth month] + 12; } else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] == [dateComponentsBirth month]) { months = 11; } else { months = [dateComponentsNow month] - [dateComponentsBirth month]; } NSLog(@"months:%d", months); if ([dateComponentsNow year] == [dateComponentsBirth year] && [dateComponentsNow month] == [dateComponentsBirth month]) { days = [dateComponentsNow day] - [dateComponentsBirth day]; } if (years == 0 && months == 0) { if (days == 1) { return [NSString stringWithFormat:@"%d %@", days, NSLocalizedString(@"day", @"day")]; } else { return [NSString stringWithFormat:@"%d %@", days, NSLocalizedString(@"days", @"days")]; } } else if (years == 0) { if (months == 1) { return [NSString stringWithFormat:@"%d %@", months, NSLocalizedString(@"month", @"month")]; } else { return [NSString stringWithFormat:@"%d %@", months, NSLocalizedString(@"months", @"months")]; } } else if ((years != 0) && (months == 0)) { if (years == 1) { return [NSString stringWithFormat:@"%d %@", years, NSLocalizedString(@"year", @"year")]; } else { return [NSString stringWithFormat:@"%d %@", years, NSLocalizedString(@"years", @"years")]; } } else { if ((years == 1) && (months == 1)) { return [NSString stringWithFormat:@"%d %@ %d %@", years, NSLocalizedString(@"year and", @"year and"), months, NSLocalizedString(@"month", @"month")]; } else if (years == 1) { return [NSString stringWithFormat:@"%d %@ %d %@", years, NSLocalizedString(@"year and", @"year and"), months, NSLocalizedString(@"months", @"months")]; } else if (months == 1) { return [NSString stringWithFormat:@"%d %@ %d %@", years, NSLocalizedString(@"years and", @"years and"), months, NSLocalizedString(@"month", @"month")]; } else { return [NSString stringWithFormat:@"%d %@ %d %@", years, NSLocalizedString(@"years and", @"years and"), months, NSLocalizedString(@"months", @"months")]; } } }
Initial code and idea has been taken from Hamish Rickerby
thank you very much.
This is super useful, plusangel. Thank you verymuch for posting this! 🙂
Thanks,
just a small issue when the dob.month == now.month and months=11, we should check for day too :
else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] == [dateComponentsBirth month] && [dateComponentsNow day] < [dateComponentsBirth day]) {
months = 11;
}
Thanks for that.