2010-12-16 9 views
46

wie das Alter zu berechnen, basierend auf dem Geburtsdatum in diesem Format 1976.06.24 mon/Datum/Jahr ...Wie das Alter zu berechnen, basierend auf NSDate

+2

Wir haben nichts dagegen, Menschen bei den Hausaufgaben zu helfen, aber wir erwarten, dass sie anerkennen, dass es das ist, was es ist. Und wir erwarten, dass sie sich Mühe gegeben haben, das Problem selbst zu lösen. – DOK

+0

Ich könnte mir vorstellen, dass der grundlegende Algorithmus etwas wie "age = current_date - birth_date" sein würde. – filipe

+0

ist es notwendig, dass das Geburtsdatum im d/m/y Format sein sollte? –

Antwort

10

Hier ist, wie Sie Ihr tatsächliches Alter basierte berechnen an Ihrem Geburtsdatum in Jahren und Tagen:

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

Es gibt die Jahre und die genauen Tage zurück. Und wenn Sie brauchen, können Sie den NSDateFormatter und vieles mehr ändern.

+0

+1 für Sie, es hat mir geholfen. Danke ....... – Sabby

+2

Und es gibt keine Schaltjahre, in denen Sie leben? ;) –

+0

Ich lebe auf dem Mars - Neugier hat mich noch nicht entdeckt. Ich kenne die Möglichkeiten von Datumsberechnungen in Objective-C nicht, aber meine Antwort ist eine recht einfache Lösung, aber ich denke, es gibt eine genauere Lösung (auf deinem Planeten) ;-) –

2

Wenn u wollen allein .use unter einem Alter zu finden, die Schaltjahr Berechnung gehören zu

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

Viele dieser Antworten nicht richtig für Schaltjahre berücksichtigen und solche, am besten ist, anstatt Apples Methoden zu verwenden, durch Konstanten zu dividieren.

Ich denke, das ist sauberer und genauer als alle anderen Antworten hier.

+1

Wow! Gute Antwort ! Dies verdient eine eigene Face Palm: D! – Razvan

+1

große Antwort ... :) –

+2

Das half mir, das Alter als Int. In meinem Fall musste ich auch das Datum aus der Zeichenkette konvertieren, bevor ich folgendes benutze: NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat: @ "MM/TT/JJJJ"]; NSDate * Geburtstag = [dateFormat dateFromString: @ "19.11.1986"]; – Gamerlegend

0

der einfachste Weg ist die NSCalendar zu verwenden:

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

NSLog(@"%@", _diff); 
6

Dies ist der Code, den ich von diesem link bekam .. es große Werke .. Out Put wird wie „5 Jahre 6 Monate“ und alle usecases sind darin enthalten.

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

Wenn Sie Alter wollen wie int folgende Antwort versuchen .., die ich aus folgenden bekam link

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

Hope this jemand hilft ..

+0

Das hat mir geholfen, das Alter als Int. In meinem Fall musste ich auch das Datum von String konvertieren, bevor ich die Funktion NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat: @ "MM/TT/JJJJ"]; NSDate * dob = [DatumFormat DatumFromString: @ "19.11.1986"]; NSLog (@ "ALTER:% d", [Selbstalter: Geburtsdatum]); – Gamerlegend

+0

vollständigste Antwort berechnet auch Monate, danke –

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

Kann sein, ich m falsch, aber das ist einfacher, nicht wahr?

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

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

was ist, wenn es ein Schaltjahr ist? – AnthonyLambert

+0

Es ist einfacher, nicht genau :-) – Pedro

3

Eine einfache rasche Erweiterung verwenden, um das Alter zu erhalten/wie alt ist ein 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 ! 

By the way, sollten Sie vorsichtig sein, das ist die westliche Auffassung des Alters, die Zählung ist in einigen anderen Ländern anders (Korea für Beispiel).

0

Hier ist eine Funktion Alter (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
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

Method in Swift 3 und höher Syntax auf cobbal's solution zu berechnen.

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 
    } 
Verwandte Themen