web-dev-qa-db-fra.com

Comment calculer l'âge en fonction de NSDate

comment calculer l'âge en fonction de la date de naissance dans ce format le 24/06/1976 lun/date/année ...

49
Linux world

Bon nombre de ces réponses ne tiennent pas correctement compte des années bissextiles et le mieux est d'utiliser les méthodes d'Apple au lieu de diviser par des constantes.

Rapide

let birthday: NSDate = ...
let now = Date()
let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
let age = ageComponents.year

Objectif c

NSDate* birthday = ...;

NSDate* now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar] 
                                   components:NSCalendarUnitYear 
                                   fromDate:birthday
                                   toDate:now
                                   options:0];
NSInteger age = [ageComponents year];

Je pense que cela est plus propre et plus précis que l'une des autres réponses ici.

257
cobbal

Voici comment calculer votre âge réel en fonction de votre date de naissance en années et en jours:

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

Il retourne les années et les jours exacts. Et si vous en avez besoin, vous pouvez modifier NSDateFormatter et bien plus encore.

10
Fabio Poloni

C’est le code que j’ai obtenu de ce link .. cela fonctionne très bien .. La mise sera comme "5 ans, 6 mois" et tous les cas d’utilisation y sont traités.

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

Si vous voulez un âge aussi élevé, essayez la réponse suivante .. que j'ai obtenue en suivant 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];
  }
}

J'espère que cela aide quelqu'un ..

6
Dilip Rajkumar

Une extension Swift simple à utiliser pour obtenir l’âge/quel âge a 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 !

À propos, il faut faire attention, c'est la conception occidentale de l'âge, le comptage est différent dans d'autres pays ( Corée par exemple) 

3
Antzi

Si tu veux trouver l’âge seul.

- (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];
    }
}
3
Asta ni enohpi

Je me trompe peut-être, mais c'est plus simple, n'est-ce pas?

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

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

Voici une fonction pour calculer l'âge (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
Blaine Rothrock

Méthode en syntaxe Swift 3 et supérieure basée sur solution de cobbal .

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
Maverick
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
raw3d
   -(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
ravinder521986

le moyen le plus simple consiste à utiliser le NSCalendar:

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

NSLog(@"%@", _diff);
0
holex