我正在阅读一本关于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;
答案 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];