两个日期之间经过的天数

时间:2012-09-22 19:37:41

标签: objective-c nsdate days elapsed

我正在阅读一本关于Objective-C的书,我正在进行一项练习,在NSDate类中添加一个名为elapsedDays的类,它返回两个日期之间经过的天数。这是我的尝试:

-(unsigned long) elapsedDays: (NSDate *) theDate{

return ([self timeIntervalSinceDate:theDate]/3600)/24;

}

以下是我测试代码的程序的主要部分:

NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];


NSLog(@"%@",now);
NSLog(@"%@",yesterday);

NSLog(@"%lu",([now elapsedDays:yesterday]));

问题是我的结果一直是零:

2012-09-22 19:28:24 +0000
2012-09-21 19:28:24 +0000
0

我发现[self timeIntervalSinceDate:theDate]/3600的划分正在给出23.99972222222222。这很奇怪,因为它应该给我们24,因为两个日期之间的差异只是一天24小时。我想了解为什么这段代码在两个日期之间给出了错误的秒数。

我通过舍入除法的结果纠正了这一点,但仍然想要了解什么是错的。

return round ([self timeIntervalSinceDate:theDate] / 3600) / 24;  

3 个答案:

答案 0 :(得分:1)

NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];

以上两个陈述将一个接一个地执行。因此,你在24小时内获得1秒的差异。

答案 1 :(得分:0)

不要做自己的日期计算;让NSCalendar为你做。请参阅-components:fromDate:toDate:options:以及其他有用的方法。

了解浮点运算的固有局限性也很有帮助。例如,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 2 :(得分:0)

我认为Yashavant的回答可能是正确的。记录的字符串可能看起来相同,但基础日期对象可能会以毫秒为单位。尝试昨天这样做,看看它是否解决了你的问题:

NSDate *yesterday = [NSDate dateWithTimeInterval:-86400 sinceDate:now];