How to calculate the age based on NSDate

IosDateNsdateFoundation

Ios Problem Overview


how to calculate the age based on the birth date in this format 6/24/1976 mon/date/year...

Ios Solutions


Solution 1 - Ios

Many of these answers don't properly account for leap years and such, best is to use Apple's methods instead of dividing by constants.

Swift
let birthday: NSDate = ...
let now = Date()
let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
let age = ageComponents.year
Objective-C
NSDate* birthday = ...;

NSDate* now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar] 
                                   components:NSCalendarUnitYear 
                                   fromDate:birthday
                                   toDate:now
                                   options:0];
NSInteger age = [ageComponents year];

I think this is cleaner and more accurate than any of the other answers here.

Edit

Increase accuracy by setting both birthday and now to noon. Here is one way to do that with a Date extension (in Swift)...

/// Returns a new date identical to the receiver except set to precisely noon.
/// Example: let now = Date().atNoon()
func atNoon() -> Date {
    var components = (Calendar.current as NSCalendar).components([.day, .month, .year, .era, .calendar, .timeZone], from: self)
    components.hour = 12
    components.minute = 0
    components.second = 0
    components.nanosecond = 0
    return Calendar.current.date(from: components)!
}

Solution 2 - Ios

Here's how you can calculate your actual age based on your birth date in years and days:

NSString *birthDate = @"03/31/1990";	
NSDate *todayDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
int time = [todayDate timeIntervalSinceDate:[dateFormatter dateFromString:birthDate]];
int allDays = (((time/60)/60)/24);
int days = allDays%365;
int years = (allDays-days)/365;

NSLog(@"You live since %i years and %i days",years,days);

It returns the years and the exact days. And if you need you can change the NSDateFormatter and much more.

Solution 3 - Ios

This is the code I got from this link.. it works great.. Out put will be like "5 years 6 months" and all usecases are covered in it.

- (NSString *)age:(NSDate *)dateOfBirth {
   NSInteger years;
   NSInteger months;
   NSInteger days;
   
   NSCalendar *calendar = [NSCalendar currentCalendar];
   	unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;

   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];
}

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 {
   months = [dateComponentsNow month] - [dateComponentsBirth month];
}

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 day", days];
   } else {
      return [NSString stringWithFormat:@"%d days", days];
   }
} else if (years == 0) {
   if (months == 1) {
      return [NSString stringWithFormat:@"%d month", months];
   } else {
      return [NSString stringWithFormat:@"%d months", months];
   }
} else if ((years != 0) && (months == 0)) {
   if (years == 1) {
       return [NSString stringWithFormat:@"%d year", years];
   } else {
       return [NSString stringWithFormat:@"%d years", years];
   }
} else {
  if ((years == 1) && (months == 1)) {
      return [NSString stringWithFormat:@"%d year and %d month", years, months];
  } else if (years == 1) {
      return [NSString stringWithFormat:@"%d year and %d months", years, months];
  } else if (months == 1) {
      return [NSString stringWithFormat:@"%d years and %d month", years, months];
  } else {
      return [NSString stringWithFormat:@"%d years and %d months", years, months];
  }
}
}

If you want age as int try the following answer.. which I got from following link

- (NSInteger)age:(NSDate *)dateOfBirth {
  NSCalendar *calendar = [NSCalendar currentCalendar];
  unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
  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]))) {
    return [dateComponentsNow year] - [dateComponentsBirth year] - 1;
  } else {
    return [dateComponentsNow year] - [dateComponentsBirth year];
  }
}

Hope this helps some one..

Solution 4 - Ios

If u want to find age alone .use below one which include leap year calculation too

- (NSInteger)age:(NSDate *)dateOfBirth {
	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]))) {
		return [dateComponentsNow year] - [dateComponentsBirth year] - 1;
	} else {
		return [dateComponentsNow year] - [dateComponentsBirth year];
	}
}

Solution 5 - Ios

A simple to use swift extension to get the age/how old is a NSDate

extension NSDate {
    var age: Int {
        let calendar: NSCalendar = NSCalendar.currentCalendar()
        let now = calendar.startOfDayForDate(NSDate())
        let birthdate = calendar.startOfDayForDate(self)
        let components = calendar.components(.Year, fromDate: birthdate, toDate: now, options: [])
        return components.year
    }
}

Exemple:

NSDate(timeIntervalSince1970:0).age // => 45 (as of nov 2015) Epoch happened 45 year ago !

By the way, you should be careful, this is the western conception of age, the counting is different in some other countries (Korea for exemple).

Solution 6 - Ios

May be I'm wrong, but this is simpler, isn't it?

NSTimeInterval ageInterval = [birthDate timeIntervalSinceDate:[NSDate date]];

NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));

Solution 7 - Ios

Method in Swift 3+ syntax based on cobbal's solution.

func calculateAgeInYearsFromDateOfBirth (birthday: Date) -> Int {
        let now = Date()
        let calendar = Calendar.current
        
        let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
        let age = ageComponents.year!
        return age
    }

Solution 8 - Ios

the easiest way is to use the NSCalendar:

NSDate *_dateOfBirth = ...;
NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0];

NSLog(@"%@", _diff);

Solution 9 - Ios

   -(NSInteger) ComputeYearMonth
    {
  NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd"];

NSDate *DateOfBirth=[format dateFromString:[NSString stringWithFormat:@"%@-%@-%@",year,month,day]];
NSDate *currentTime = [NSDate date];

NSLog(@"DateOfBirth======%@",DateOfBirth);

NSInteger years = [[[NSCalendar currentCalendar] components:NSYearCalendarUnit
                                                   fromDate:DateOfBirth
                                                     toDate:currentTime options:0]year];

NSInteger months = [[[NSCalendar currentCalendar] components:NSMonthCalendarUnit
                                                    fromDate:DateOfBirth
                                                      toDate:currentTime options:0]month];
NSLog(@"Number of years: %d",years);
NSLog(@"Number of Months: %d,",months);



    return years;
  // End of Method
  }

Solution 10 - Ios

Here's a function to calculate age (Swift 2.1)

func calculateAge (birthday: NSDate) -> NSInteger {
    
    let calendar : NSCalendar = NSCalendar.currentCalendar()
    let unitFlags : NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day]
    let dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: NSDate())
    let dateComponentBirth : NSDateComponents = calendar.components(unitFlags, fromDate: birthday)
    
    if ( (dateComponentNow.month < dateComponentBirth.month) ||
        ((dateComponentNow.month == dateComponentBirth.month) && (dateComponentNow.day < dateComponentBirth.day))
        )
    {
        return dateComponentNow.year - dateComponentBirth.year - 1
    }
    else {
        return dateComponentNow.year - dateComponentBirth.year
    }
}

Solution 11 - Ios

let birthday = NSCalendar.currentCalendar().dateWithEra(1, year: 2016, month: 07, day: 25, hour: 8, minute: 53, second: 0, nanosecond: 0)!

func calculateAge(birthday: NSDate) -> String {

func grammaticalString(forUnit unit: String, value: Int) -> String {
    if value > 1 {
        return "\(value) \(unit)s"
    } else {
        return "\(value) \(unit)"
    }
}

let calendar = NSCalendar.currentCalendar()
let unitFlags: NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute]

let ageComponent = calendar.components(unitFlags, fromDate: birthday, toDate: NSDate(), options: [])
let years = ageComponent.year
let months = ageComponent.month
let days = ageComponent.day
let hours = ageComponent.hour

switch (years, months, days, hours) {
    case (let y, let m, _, _) where y > 0:
        return "\(grammaticalString(forUnit: "Year", value: y)) \(grammaticalString(forUnit: "Month", value: m))"

    case (let y, let m, let d, _) where y == 0 && m > 0:
        return "\(grammaticalString(forUnit: "Month", value: m)) \(grammaticalString(forUnit: "Day", value: d))"

    case (let y, let m, let d, _) where y == 0 && m == 0 && d > 0:
        return "\(grammaticalString(forUnit: "Day", value: d))"

    case (let y, let m, let d, let h) where y == 0 && m == 0 && d == 0 && h > 0:
        return "\(grammaticalString(forUnit: "Hour", value: h))"

    case (let y, let m, let d, let h) where y == 0 && m == 0 && d == 0 && h == 0:

        if ageComponent.minute > 0 {
            return "\(grammaticalString(forUnit: "Minute", value: ageComponent.minute))"
        } else {
            return "-"
        }

    default:
        return "-"
}

}

// Output will be any of these
// 2 Years 3 Months
// 3 Months 0 Days
// 2 Days
// 3 Hours
// 45 Minutes
// -

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLinux worldView Question on Stackoverflow
Solution 1 - IoscobbalView Answer on Stackoverflow
Solution 2 - IosFabio PoloniView Answer on Stackoverflow
Solution 3 - IosDilip RajkumarView Answer on Stackoverflow
Solution 4 - IosAsta ni enohpiView Answer on Stackoverflow
Solution 5 - IosAntziView Answer on Stackoverflow
Solution 6 - IosPedroView Answer on Stackoverflow
Solution 7 - IosMaverickView Answer on Stackoverflow
Solution 8 - IosholexView Answer on Stackoverflow
Solution 9 - Iosravinder521986View Answer on Stackoverflow
Solution 10 - IosBlaine RothrockView Answer on Stackoverflow
Solution 11 - Iosraw3dView Answer on Stackoverflow