# Calculating the age of a person using two NSDates

My class representing a person has a method to calculate that person’s age:

``````@interface Student : NSObject

@property (strong) NSDate *dob;

// This method will work out the person's age in calendar years
- (NSDateComponents*)ageCalculation:(NSDate*)dob;
``````

Here is the class implementation file

• How to do a natural sort on an NSArray?
• NSIndexSet “-indexAtIndex:”?
• Swift - Write Image from URL to Local File
• Bluetooth/WiFi between Mac app and iOS app
• What's the difference between Optional<T> and optional types in Swift? Extending Optional to carry error information?
• How can I replace my .xib file with pure Swift 3?
• ``````@implementation Student

- (NSDateComponents*)ageCalculation:(NSDate*)dob {
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit;
NSDateComponents *components = [calendar components:units
fromDate:dob
toDate:now
options:0];
return components;
}

@end
``````

I’m not sure that I’m doing this right, though:

``````Student *student1 = [[Student alloc] init];
[student1 setDob:aDateOfBirth];
NSDateComponents *ageComponents = [student1 ageCalculation:aDateOfBirth];
``````

What should I do with the result of this method? How can I make `ageCalculation:` use the date I already set?

### 2 Solutions Collect From Internet About “Calculating the age of a person using two NSDates”

There are a couple of things that can be noted. First of all, the code for computing the age is fine, except that I don’t understand why you return `NSDateComponents` instead of just the age in years.

Here’s how I would do it

``````- (NSInteger)age {
NSDate *today = [NSDate date];
NSDateComponents *ageComponents = [[NSCalendar currentCalendar]
components:NSYearCalendarUnit
fromDate:self.dob
toDate:today
options:0];
return ageComponents.year;
}
``````

You are interested only in the `year` component, so return it instead of `NSDateComponents`. Using `self.dob` instead of an argument gets the date you set earlier.

Just created a simple method that returns the age in years as a string.

``````-(NSString *) getAge:(NSDate *)dateOfBirth {

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierIndian];
NSDateComponents *components = [calendar components:NSYearCalendarUnit
fromDate:dateOfBirth
toDate:[NSDate date]
options:0];

return [NSString stringWithFormat:@"%li",components.year];
}
``````

NOTE

1. This uses Indian Calendar – change it if u wish.
2. To call `NSString *yearsOldinString = [self getAge:dateOfBirth];`, where dateOfBirth represents person’s date of birth in NSDate format.