从出生日期开始提取的年龄总是偏离不一致的数量

时间:2014-04-01 03:23:12

标签: objective-c cocoa nsdate nsdateformatter nscalendar

我正在使用以下代码将用户提供的生日期转换为当前日期的等效年份。输出总是以数年不一致的数量和数天和数月的非常大的数量来关闭。

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

输入"06-16-1986"时输出的内容如下

  

年:28,天:9223372036854775807,月:9223372036854775807

年份偏离1,月份和日期产生极大数量。我使用各种日期得到同样的问题。例如,"12-07-1989"生成

  

年:25,天:9223372036854775807,月:9223372036854775807

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

问题出在这一行

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

如果你想要月份&要计算的天数,你需要在这样的组件中包含它

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

月份字符串

的格式也有误
[tempFormatter setDateFormat:@"yyyy-mm-dd hh:mm:ss"];

应更正为

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

现在您将获得正确的日期。

解释。 如苹果文档中所述,这些是基于1的。因此,如果你没有提供一个默认值为1的值。所以早些时候您的月份格式是" mm"它没有正确设定一个月的生日,因此它是1986-01-16所以现在是2014-04-01(新加坡)。所以你得到28年是正确的。

答案 1 :(得分:0)

|NSMonthCalendarUnit|NSDayCalendarUnit添加到您的组件,将日期格式从yyyy-mm-dd hh:mm:ss更改为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);