Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.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
Iphone 对于给定月份的最后一天-iOS,NSTimeInterval似乎是错误的_Iphone_Objective C_Nsdate_Nsdateformatter_Nstimeinterval - Fatal编程技术网

Iphone 对于给定月份的最后一天-iOS,NSTimeInterval似乎是错误的

Iphone 对于给定月份的最后一天-iOS,NSTimeInterval似乎是错误的,iphone,objective-c,nsdate,nsdateformatter,nstimeinterval,Iphone,Objective C,Nsdate,Nsdateformatter,Nstimeinterval,在本地数据库中,我保存了NSTimeInterval值的列表。 我必须找出并取得一个月内所有可用的记录。唯一的问题是获取给定月份最后一天的记录似乎不可用 假设给定的月份是12月,因此我必须从12月1日到12月31日(直到晚上11:59)获取所有记录 我正在使用以下实现: [self.dateFormatter setDateFormat:@"dd-MM-yyyy"]; NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-20

在本地数据库中,我保存了NSTimeInterval值的列表。 我必须找出并取得一个月内所有可用的记录。唯一的问题是获取给定月份最后一天的记录似乎不可用

假设给定的月份是12月,因此我必须从12月1日到12月31日(直到晚上11:59)获取所有记录

我正在使用以下实现:

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"];
NSDate *endDate = [self.dateFormatter dateFromString:@"31-12-2012"];

NSTimeInterval startDateTimeInterval = [startDate timeIntervalSince1970];
NSTimeInterval endDateTimeInterval = [endDate timeIntervalSince1970];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate <= %f)",startDateTimeInterval,endDateTimeInterval]];
[self.dateFormatter setDateFormat:@“dd-MM-yyyy”];
NSDate*startDate=[self.dateFormatter dateFromString:@“1-12-2012”];
NSDate*endDate=[self.dateFormatter dateFromString:@“31-12-2012”];
NSTimeInterval startDateTimeInterval=[startDate TimeIntervalence1970];
NSTimeInterval endDateTimeInterval=[endDate timeIntervalSince1970];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@”(mdate>=%f)和(mdate您正在创建的
NSDate
对象的时间隐式为00:00。因此谓词搜索将不包括从00:01到23:59的最后一天。最简单的更改是将结束日期设置为下一天(下个月的第一天)并将谓词更改为小于,而不是小于或等于

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"]; // start of range, inclusive
NSDate *endDate = [self.dateFormatter dateFromString:@"1-1-2013"]; // end of range, exclusive
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate < %f)",startDateTimeInterval,endDateTimeInterval]];
[self.dateFormatter setDateFormat:@“dd-MM-yyyy”];
NSDate*startDate=[self.dateFormatter dateFromString:@“1-12-2012”];//范围的开始,包括在内
NSDate*endDate=[self.dateFormatter dateFromString:@“1-1-2013”];//范围结束,独占
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@“(mdate>=%f)和(mdate<%f)”,startDateTimeInterval,endDateTimeInterval];

您正在创建的
NSDate
对象的隐式时间为00:00。因此谓词搜索将不包括从00:01到23:59的最后一天。最简单的更改是将结束日期设置为第二天(下个月的第一天),并将谓词更改为小于,而不是小于或等于

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"]; // start of range, inclusive
NSDate *endDate = [self.dateFormatter dateFromString:@"1-1-2013"]; // end of range, exclusive
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate < %f)",startDateTimeInterval,endDateTimeInterval]];
[self.dateFormatter setDateFormat:@“dd-MM-yyyy”];
NSDate*startDate=[self.dateFormatter dateFromString:@“1-12-2012”];//范围的开始,包括在内
NSDate*endDate=[self.dateFormatter dateFromString:@“1-1-2013”];//范围结束,独占
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@“(mdate>=%f)和(mdate<%f)”,startDateTimeInterval,endDateTimeInterval];

杰森的回答将解决问题,但我想我已经解决了困惑:虽然在普通英语中日期通常指定一整天,但在可可语中,
NSDate
是一个精确的时间点。因此它没有长度,完整的描述需要更多的细节,而不仅仅是日/月/年。大多数标准的crea方法ting-an
NSDate
提供精确到最接近整秒的精度,显然,一旦转换为“NSTimeInterval”,通常可以做得更好

NSLog
正在打印30,因为在每月1日和31日的同一时间之间有30整天,就像在1日和2日的同一时间之间有一整天,在1日和1日的同一时间之间没有整天一样


因此,Jason的答案是正确的,因为它采用了“本月第一天开始之后,下个月第一天开始之前”的时间测试。正是“本月第一天开始之前”这一点起了作用。

Jason的答案将解决问题,但我想我已经解决了困惑:虽然在普通英语中h日期通常指定一整天,用可可语来说,
NSDate
是一个精确的时间点。因此,它没有长度,完整的描述需要更多的细节,而不仅仅是日/月/年。大多数创建
NSDate
的标准方法都提供了精确到最接近的整秒的精度,很明显,一旦转换为'N'你通常可以做得更好

NSLog
正在打印30,因为在每月1日和31日的同一时间之间有30整天,就像在1日和2日的同一时间之间有一整天,在1日和1日的同一时间之间没有整天一样


因此,Jason的答案是正确的,因为它应用了“本月第一天开始之后,下个月第一天开始之前”的时间测试。正是“开始”位起了作用。

我假设您没有提供时间,结果是日期就在一天的开始。什么如果您记录
(endDateTimeInterval-startDateTimeInterval)/(60.0*60.0*24.0),则不会发生这种情况
?日志:30…应该是31对吗?但为什么会是30。计算第一天和最后一天的时间间隔不是正确的方法吗?我假设您没有提供时间会导致日期在一天的最开始。如果您记录
(endDateTimeInterval-startDateTimeInterval)/(60.0*60.0*24.0),会发生什么
?日志:30…应该是31对吗?但为什么会是30。计算第一天和最后一天的时间间隔不是正确的方法吗?