如何根据出生日期以这种格式计算年龄 6/24/1976 星期一/日期/年...
问问题
32534 次
11 回答
264
这些答案中的许多都没有正确考虑闰年等,最好是使用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];
我认为这比这里的任何其他答案都更干净、更准确。
编辑
birthday
通过将和设置now
为中午来提高准确性。这是一种通过Date
扩展(在 Swift 中)来做到这一点的方法......
/// Returns a new date identical to the receiver except set to precisely noon.
/// Example: let now = Date().atNoon()
func atNoon() -> Date {
var components = (Calendar.current as NSCalendar).components([.day, .month, .year, .era, .calendar, .timeZone], from: self)
components.hour = 12
components.minute = 0
components.second = 0
components.nanosecond = 0
return Calendar.current.date(from: components)!
}
于 2011-05-23T21:06:04.633 回答
9
以下是如何根据您的出生日期(以年和日为单位)计算实际年龄的方法:
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 等等。
于 2010-12-18T17:41:25.400 回答
6
这是我从这个链接获得的代码.. 效果很好.. 输出将类似于“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 = 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];
}
}
希望这对某人有帮助..
于 2012-06-11T11:29:46.620 回答
3
如果你想单独找到年龄。使用下面的一个也包括闰年计算
- (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];
}
}
于 2011-03-31T11:32:07.020 回答
3
一个简单易用的快速扩展来获取年龄/几岁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 !
顺便说一句,你要小心,这是西方的年龄概念,其他国家(例如韩国)的计数方式不同。
于 2015-11-05T12:00:33.570 回答
2
可能是我错了,但这更简单,不是吗?
NSTimeInterval ageInterval = [birthDate timeIntervalSinceDate:[NSDate date]];
NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));
于 2014-02-05T07:40:31.913 回答
2
基于cobbal 解决方案的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
}
于 2017-12-12T20:02:46.630 回答
0
最简单的方法是使用 NSCalendar:
NSDate *_dateOfBirth = ...;
NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0];
NSLog(@"%@", _diff);
于 2012-04-11T14:34:55.493 回答
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
}
于 2012-12-21T07:23:31.630 回答
0
这是一个计算年龄的函数(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
}
}
于 2015-11-12T19:53:42.837 回答
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
// -
于 2016-07-25T03:32:10.380 回答