遇到initWithTimeInterval问题

时间:2013-10-30 04:04:13

标签: ios objective-c nsdate

我是ios编程的新手。

我正试图通过以下代码获取死亡日期。 但是,我得到了意想不到的结果。

在下面的示例代码中,某人的出生日期为1899-12-31,此人的死亡年龄为80岁。

所以,我期待这个人的死亡日期是1979-12-31。 但是,我得到的结果是1843-11-05 08:31:44 +0000。

有人可以告诉我这段代码有什么问题吗?

谢谢!

NSInteger year = [_selectedDeathAge intValue];
NSLog(@"%d", year); //80

NSLog(@"%@", _selectedBirthDate);//(NSDate)1899-12-31 15:00:00 +0000 

NSDate *deathDate = [_selectedBirthDate initWithTimeInterval:year * 365 * 24 * 60 * 60 sinceDate:_selectedBirthDate];

NSLog(@"%@", deathDate);//(NSDate)1843-11-05 08:31:44 +0000

3 个答案:

答案 0 :(得分:2)

请勿使用NSDate进行相对日期计算。使用NSCalendarNSDateComponents

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *yearsComponents = [[NSDateComponents alloc] init];
yearsComponents.year = [_selectedDeathAge intValue];
NSDate *deathDate = [cal dateByAddingComponents:yearsComponents toDate:_selectedBirthDate];

答案 1 :(得分:2)

您不应该在另一个实例上调用initWithTimeInterval:sinceDate:方法。

你应该这样做:

NSDate *deathDate = [_selectedBirthDate dateByAddingTimeInterval:year * 365 * 24 * 60 * 60];

或者你可以这样做:

NSDate *deathDate = [[NSDate alloc] initWithWithTimeInterval:year * 365 * 24 * 60 * 60 sinceDate:_selectedBirthDate];

但最后,你应该使用“Jacob Relkin”的解决方案。对于这种类型的计算,这是更好的解决方案。

答案 2 :(得分:1)

NSDate *deathDate = [_selectedBirthDate initWithTimeInterval:year * 365 * 24 * 60 * 60 sinceDate:_selectedBirthDate];

这一行是错误的,你应该期待奇怪的结果。您在已初始化的函数上调用init。您需要通过[[NSDate alloc] initWithTimeInterval:sinceDate:]创建它,此外,您不应该像这样硬编码时间间隔。查看NSDateComponents