Как рассчитать возраст на основе NSDate - PullRequest
50 голосов
/ 16 декабря 2010

как рассчитать возраст на основе даты рождения в этом формате 24.06.1976 пн / дата / год ...

Ответы [ 11 ]

258 голосов
/ 24 мая 2011

Многие из этих ответов не учитывают високосные годы, поэтому лучше всего использовать методы Apple вместо деления на константы.

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

Я думаю, что это чище и точнее, чем любой другой ответ здесь.

10 голосов
/ 18 декабря 2010

Вот как вы можете рассчитать свой фактический возраст на основе даты вашего рождения в годах и днях:

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);

Возвращает годы и точные дни.И если вам нужно, вы можете изменить NSDateFormatter и многое другое.

6 голосов
/ 11 июня 2012

Это код, который я получил по этой ссылке .. он отлично работает .. Результат будет как "5 лет 6 месяцев", и все варианты использования покрыты этим.

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

Если вы хотите age как int, попробуйте следующий ответ ... который я получил по следующей ссылке 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];
  }
}

Надеюсь, это кому-нибудь поможет ..

3 голосов
/ 05 ноября 2015

Простое в использовании быстрое расширение, чтобы узнать возраст / возраст 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
    }
}

Например:

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

Кстати, вы должны быть осторожны,это западная концепция возраста, в некоторых других странах подсчет отличается ( Корея для примера).

3 голосов
/ 31 марта 2011

Если вы хотите найти только возраст .use ниже единицы, которая включает в себя расчет високосного года

- (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];
    }
}
2 голосов
/ 05 февраля 2014

Может быть, я ошибаюсь, но это проще, не так ли?

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

NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));
1 голос
/ 12 декабря 2017

Метод в Swift 3 + синтаксис, основанный на решении Коббала .

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
    }
0 голосов
/ 25 июля 2016
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 голосов
/ 12 ноября 2015

Вот функция для расчета возраста (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
    }
}
0 голосов
/ 21 декабря 2012
   -(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
  }
...