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

  • CLOCKS_PER_SEC Not Matching Results From std::clock()
  • Convert Seconds Integer To HH:MM, iPhone
  • Measuring Time Accurately in Swift for Comparison Across Devices
  • Find correct time on iOS device
  • get time between two times of the day
  • Creating a time range for AVAssetExportSession
  • @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.