【问题标题】:Elapsed days between two dates两个日期之间经过的天数
【发布时间】:2012-09-22 19:37:40
【问题描述】:

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

【问题讨论】:

    标签: objective-c nsdate days elapsed


    【解决方案1】:

    NSDate *now = [NSDate date];

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

    以上两条语句将一个接一个地执行。因此,您在 24 小时内获得 1 秒的差异。

    【讨论】:

    • 但正如您在输出中看到的那样,它显示:2012-09-22 19:28:24 +0000 2012-09-21 19:28:24 +0000
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        相关资源
        最近更新 更多