与 NSDateComponents 的时差

Time difference with NSDateComponents

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

我已经将 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 来总结所有 "spans" 组合的长度。我通过设置 2 个 NSDates 来做到这一点,只是为了计算差异。

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

我正在设置这些标志:

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

和 return 结果为 NSDateComponent 像这样:

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

我的问题:当我使用上面的单位时,我得到了错误的结果 - 即 11h 20m 而真正的答案是 83h.我了解到我不必要地指定了 NSCalendarUnitDayNSCalendarUnitMonth 单位。阅读文档后,我阅读了 "There is no need to specify any more components than those in which you are interested" 并删除了两个不必要的指定单位。这给了我正确的结果,但怎么会呢? 为什么简单地指定更多的单位会报错?

谢谢!

Why would it report the wrong result by simply specifying more units?

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

只要求几秒钟就会得到几秒钟,要求几秒钟和几天就会得到那些。只询问天数会给你完整的天数,所以它是 3。 请注意,NSDateComponents 可以表示日期(点时间),也可以表示时间间隔。

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

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