Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有NSDATE组件的时差_Ios_Objective C_Nsdate_Nsdatecomponents - Fatal编程技术网

Ios 具有NSDATE组件的时差

Ios 具有NSDATE组件的时差,ios,objective-c,nsdate,nsdatecomponents,Ios,Objective C,Nsdate,Nsdatecomponents,我正在构建一个应用程序,而我需要计算两个日期之间的时间 我将NSObject子类化,并将其命名为“MyObject”(为了这个问题而简化) 它拥有这两个属性 @property (nonatomic, strong) NSDate *startDate; @property (nonatomic, strong) NSDate *endDate; 我有一个存储x个myObject的数组,我像这样循环 NSTimeInterval totalInterval = 0; for (MyObject

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

我将
NSObject
子类化,并将其命名为“MyObject”(为了这个问题而简化)

它拥有这两个属性

@property (nonatomic, strong) NSDate *startDate;
@property (nonatomic, strong) NSDate *endDate;
我有一个存储x个myObject的数组,我像这样循环

NSTimeInterval totalInterval = 0;
for (MyObject *currentObject in _listOfItems)
{
    totalInterval += [currentObject.endDate timeIntervalSinceDate:currentObject.startDate];
}
我使用
totalInterval
来总结所有“跨度”组合的长度。我通过设置2个NSDATE来实现这一点,只是为了计算差异

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。我了解到我没有必要指定
NSCalendarUnitDay
NSCalendarUnitMonth
单位。在阅读文档之后,我读到“没有必要指定比您感兴趣的组件更多的组件”,我删除了两个不必要的指定单元。这给了我正确的结果,但是为什么呢为什么只需指定更多单位,它就会报告错误的结果?

谢谢大家!

为什么它仅仅通过指定更多的单位来报告错误的结果

NSDateComponents表示两个日期之间的所有时间(本例中为300.000秒),以天(3)、小时(11)和分钟(11)为单位指定

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


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

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

不确定这是否与您的问题有关,但为了获得“现在”,我总是使用[NSDate]。此外,这些标志还包括:typedef NS_选项(NSUInteger、NSCalendarUnit)。你不应该在你的代码中将它声明为无符号int。哦,现在我想我明白了。因此,如果我只指定2天+1小时间隔的小时单位,它将显示49小时,但如果我也添加了天单位,那么它将按天和小时进行排序,这样
[组件天]
将返回3,
[组件小时]
将返回1。假设我只指定了小时单位并要求天,它将返回0天?理论上是的。但是你不应该要求你没有指定的单位,因为文档告诉你实际值是“NSDateComponentUndefined”(这是NSIntegerMax)。所以这些单位让它有点像一个排序系统,我想要的组件有多大?如果我给它一个星期,想知道这两天和两个小时的总量会怎么样?你能详细解释一下你的最后一句话吗?“作为文档…”考虑一下:3241中有多少个是?答案是32。如果问题是:“3241中有多少个十?”答案是324。要求数千人的回答是3。将它们结合起来,需要进行一些计算:有多少个十和多少个千?答案是3000和(从剩余的241)24万。这与日期组件相同,只是它包含年、月、日等。至于:的前两段的最后一句话,NSDateComponents在日历之外有点无意义。2015年,第9个月和第15天在公历中并不代表与佛教日历或中国日历中相同的时间。我想我理解。因此,如果我只指定2天+1小时间隔的小时单位,它将显示49小时,但如果我也添加了天单位,那么它将按天和小时进行排序,这样
[components days]
将返回2,
[components hours]
将返回1。假设我只指定了小时单位并要求天,它将返回0天?->使单位有点像一个排序系统,我希望组件有多大?不,你不要求的任何组件的值都是官方未定义的;有一个特殊的标记值,它将出现在
NSDateComponents
的每个未初始化字段中。