Как рассчитать возраст, основанный на NSDate - программирование
Подтвердить что ты не робот

Как рассчитать возраст, основанный на NSDate

как рассчитать возраст по дате рождения в этом формате 6/24/1976 mon/date/year...

4b9b3361

Ответ 1

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

стриж

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

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

Ответ 2

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

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 и многое другое.

Ответ 3

Это код, который я получил по этой ссылке... он отлично работает.. Выход будет как "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, попробуйте следующий ответ... который я получил по следующей ссылке

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

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

Ответ 4

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

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

Ответ 5

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

Exemple:

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

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

Ответ 6

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

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

NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));

Ответ 7

Метод в синтаксисе 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
    }

Ответ 8

Самый простой способ - использовать NSCalendar:

NSDate *_dateOfBirth = ...;
NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0];

NSLog(@"%@", _diff);

Ответ 9

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

Ответ 10

Здесь функция вычисления возраста (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
    }
}

Ответ 11

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