How to calculate the age based on NSDate

后端 未结 11 1914
孤街浪徒
孤街浪徒 2020-12-04 09:07

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

相关标签:
11条回答
  • 2020-12-04 09:22

    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)!
    }
    
    0 讨论(0)
  • 2020-12-04 09:23
    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
    // -
    
    0 讨论(0)
  • 2020-12-04 09:30

    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.

    0 讨论(0)
  • 2020-12-04 09:32
       -(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
      }
    
    0 讨论(0)
  • 2020-12-04 09:33

    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..

    0 讨论(0)
  • 2020-12-04 09:33

    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);
    
    0 讨论(0)
提交回复
热议问题