与NSDateComponents的时差

时间:2015-09-15 06:55:19

标签: ios objective-c nsdate nsdatecomponents

我正在构建一个应用程序,而我需要计算两个NSDates之间的时间。

我已经将NSObject子类化并命名为" MyObject" (为了这个问题而简化)。

它拥有这两个属性

@property (nonatomic, strong) NSDate *startDate;
@property (nonatomic, strong) NSDate *endDate;

我有一个存储x个MyObjects的数组,我就这样循环了

NSTimeInterval totalInterval = 0;
for (MyObject *currentObject in _listOfItems)
{
    totalInterval += [currentObject.endDate timeIntervalSinceDate:currentObject.startDate];
}

我使用totalInterval来总结所有"跨度的长度"结合。我通过设置2个NSDates来做到这一点,仅仅是为了计算差异。

NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:totalInterval sinceDate:date1];

我正在设置这些标志:

unsigned int unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitDay | NSCalendarUnitMonth;

将结果返回NSDateComponent,如下所示:

return [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

我的问题:当我使用上述单位时,我得到了错误的结果 - 即 11h 20m ,当真正的答案是 83h 时。我了解到我不必指定NSCalendarUnitDayNSCalendarUnitMonth单位。阅读文档之后,我读到了#34;没有必要指定任何比你感兴趣的组件更多的组件了。我删除了两个不必要的指定单位。这给了我正确的结果,但是怎么样? 为什么只需指定更多单位就会报告错误的结果?

谢谢!

2 个答案:

答案 0 :(得分:3)

计算将始终以您要求的最大单位开始。因此,如果您要求数天和数小时,但只检查小时数,您将看到模数为24的实际总小时数。这适用于NSCalendar执行的任何日期分解。

答案 1 :(得分:0)

  

为什么只需指定更多单位就会报告错误的结果?

NSDateComponents表示两个日期之间的所有时间(在您的情况下为300.000秒),在若干天(3),小时(11)和分钟(11)中指定。

只需几秒钟即可获得秒数,要求几秒钟和几天就会给你这些。问几天会给你整整几天,所以它会是3。 请注意,NSDateComponents可以表示日期(点时间)或时间间隔。

这种灵活性使您能够创建一些非常酷的基于时间的组件。