How to calculate the age based on NSDate

Linux world picture Linux world · Dec 16, 2010 · Viewed 31.9k times · Source

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

Answer

cobbal picture cobbal · May 23, 2011

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)!
}