如何根据NSDate计算年龄
如何根据这种格式的出生date计算年龄6/24/1976星期一/date/年…
许多这样的答案没有适当地考虑闰年,最好的办法是用苹果公司的方法来代替常数。
NSDate* birthday = ...; NSDate* now = [NSDate date]; NSDateComponents* ageComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:birthday toDate:now options:0]; NSInteger age = [ageComponents year];
我认为这比这里的其他答案更清晰,更准确。
以下是你如何根据你的出生date来计算你的实际年龄在几年和几天:
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等等。
这是我从这个链接得到的代码..它的工作很好..输出将像“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]; } } }
如果你想年龄作为int尝试以下答案..我从下面的链接得到
- (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]; } }
希望这有助于一个..
一个简单的使用快速扩展来获得年龄/多大年纪是一个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 !
顺便提一下,你应该小心,这是西方的年龄概念,其他一些国家(例如韩国 )的计数是不一样的。
如果你想单独查找年龄,也可以使用下面的闰年计算
- (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]; } }
可能是我错了,但这更简单,不是吗?
NSTimeInterval ageInterval = [birthDate timeIntervalSinceDate:[NSDate date]]; NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));
最简单的方法是使用NSCalendar:
NSDate *_dateOfBirth = ...; NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0]; NSLog(@"%@", _diff);
-(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 }
这里有一个计算年龄的函数(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 } }
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 // -