Age extracted from birth date always off by inconsistent amount

强颜欢笑 提交于 2019-12-20 07:43:50

问题


I'm using the following code to convert a user-supplied birthdate to its equivalent years from the current date. The output is always off by an inconsistent amount in years and very large numbers in days and months.

NSDateFormatter *tempFormatter = [[NSDateFormatter alloc] init];
[tempFormatter setDateFormat:@"yyyy-mm-dd hh:mm:ss"];
NSDate *birthDate = [tempFormatter dateFromString:[NSString stringWithFormat:@"%@-%@-%@ 01:00:00",self.birthYear.text,self.birthMonth.text,self.birthDay.text]];

NSDate* now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
                                   components:NSYearCalendarUnit
                                   fromDate:birthDate
                                   toDate:now
                                   options:0];
NSInteger years = [ageComponents year];
NSInteger days = [ageComponents day];
NSInteger months = [ageComponents month];
NSLog(@"Years: %ld, Days: %ld, Months: %ld",years,days, months);

What gets outputted when I input "06-16-1986" is the following

Years: 28, Days: 9223372036854775807, Months: 9223372036854775807

The year is off by 1 and the months and days are producing extremely large numbers. I get the same issue using various dates. For example, "12-07-1989" produces

Years: 25, Days: 9223372036854775807, Months: 9223372036854775807

What am I doing wrong here?


回答1:


the problem is in this line

NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
                                   components:NSYearCalendarUnit
                                   fromDate:birthDate
                                   toDate:now
                                   options:0];

if you want month & days to be calculated you need to include that in the components like this

NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
                                       components:( NSYearCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit) 
                                       fromDate:birthDate
                                       toDate:now
                                       options:0];

also your format is wrong for month string

[tempFormatter setDateFormat:@"yyyy-mm-dd hh:mm:ss"];

should be corrected as

[tempFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

now you will get correct date.

explanation. as mentioned on apple documentation these are 1-based. so incase you dont provide a value it will put 1 as default. so earlier your month format was "mm" and it was not correctly setting a month for the birthday hence it was 1986-01-16 so now its 2014-04-01 (in singapore). So you get 28 years which is correct.




回答2:


Add |NSMonthCalendarUnit|NSDayCalendarUnit to your components, change the date format from yyyy-mm-dd hh:mm:ss to yyyy-MM-dd hh:mm:ss:

NSDateFormatter *tempFormatter = [[NSDateFormatter alloc] init];

[tempFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSDate *birthDate = [tempFormatter dateFromString:[NSString stringWithFormat:@"%@-%@-%@ 01:00:00",@"2000", @"04",@"01"]];

NSDate* now = [NSDate date];

NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
                                   components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                                   fromDate:birthDate
                                   toDate:now
                                   options:0];
NSInteger years = [ageComponents year];
NSInteger days = [ageComponents day];
NSInteger months = [ageComponents month];
NSLog(@"Years: %d, Days: %d, Months: %d",years,days, months);


来源:https://stackoverflow.com/questions/22776203/age-extracted-from-birth-date-always-off-by-inconsistent-amount

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!