假设生日1977-8-1,当前日期2017-6-16,问:你今年多少岁?这时候根据生活中和实际档案上,我们说的年龄可能不一样,如果只用年份相减,可以说,40岁(不管你生日到了没,2017年都是40岁),但要精确到日期,因为你2017年生日还没到,可以说是39岁,生日过了之后,可以说40岁。一般生日没到大家更愿意说小一岁,也就是目前39岁,这也跟腾讯QQ上显示年龄一致。
1.根据出生日期返回年龄的方法
a、此方法有缺陷,除以年份按365天算的,并没有把闰年算进去,并不准:
-(NSString *)dateToOld:(NSDate *)bornDate{ //获得当前系统时间 NSDate *currentDate = [NSDate date]; //获得当前系统时间与出生日期之间的时间间隔 NSTimeInterval time = [currentDate timeIntervalSinceDate:bornDate]; //时间间隔以秒作为单位,求年的话除以60*60*24*356 int age = ((int)time)/(3600*24*365); return [NSString stringWithFormat:@"%d",age]; }
b、以下方法更准,推荐:
- (NSInteger)ageWithDateOfBirth:(NSDate *)date; { // 出生日期转换 年月日 NSDateComponents *components1 = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date]; NSInteger brithDateYear = [components1 year]; NSInteger brithDateDay = [components1 day]; NSInteger brithDateMonth = [components1 month]; // 获取系统当前 年月日 NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; NSInteger currentDateYear = [components2 year]; NSInteger currentDateDay = [components2 day]; NSInteger currentDateMonth = [components2 month]; // 计算年龄 NSInteger iAge = currentDateYear - brithDateYear - 1; if ((currentDateMonth > brithDateMonth) || (currentDateMonth == brithDateMonth && currentDateDay >= brithDateDay)) { iAge++; } return iAge; }
-(NSString *)dateToDetailOld:(NSDate *)bornDate{ //获得当前系统时间 NSDate *currentDate = [NSDate date]; //创建日历(格里高利历) NSCalendar *calendar = [NSCalendar currentCalendar]; //设置component的组成部分 NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ; //按照组成部分格式计算出生日期与现在时间的时间间隔 NSDateComponents *date = [calendar components:unitFlags fromDate:bornDate toDate:currentDate options:0]; //判断年龄大小,以确定返回格式 if( [date year] > 0) { return [NSString stringWithFormat:(@"%ld岁%ld月%ld天"),(long)[date year],(long)[date month],(long)[date day]]; } else if([date month] >0) { return [NSString stringWithFormat:(@"%ld月%ld天"),(long)[date month],(long)[date day]]; } else if([date day]>0) { return [NSString stringWithFormat:(@"%ld天"),(long)[date day]]; } else { return @"0天"; } }
调用以上方法
NSString *birth = @"1995-10-30"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate *birthDay = [dateFormatter dateFromString:birth]; NSLog(@"您的年龄:%@岁",[self dateToOld:birthDay]); NSLog(@"您的年龄:%@",[self dateToDetailOld:birthDay]);结果展示
2017-06-16 11:46:54.816 Test[7215:83685] 您的年龄:39岁
2017-06-16 11:46:54.817 Test[7215:83685] 您的年龄:39岁10月15天
方法转自:http://www.jianshu.com/p/fe6bd981b9f4
https://blog.csdn.net/liuyu1114/article/details/24771717