NSTimeInterval在给定月份的最后一天似乎是错误的 - iOS

时间:2012-12-03 16:22:06

标签: 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-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]];

我注意到,与第31天(9AM)的数据库中保存的值相比,endDateTimeInterval倍值非常小。但是,这有可能,我期待我的endDateTime应该到12月31日晚上11:59。

请就此问题提供意见。

2 个答案:

答案 0 :(得分:3)

您隐式创建的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]];

答案 1 :(得分:0)

杰森的答案将解决问题,但我想我已经弄清楚了这个问题:虽然在普通英语中,日期通常指定一整天,但在可可术语中,NSDate是一个确切的时刻。所以它没有长度,完整的描述需要更多的细节,而不仅仅是日/月/年。创建NSDate的大多数标准方法都提供精确到最接近的整秒,显然一旦你转换为'NSTimeInterval`,你通常可以做得更好。

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

杰森的答案是正确的,因为它适用于“本月第一天开始之后和下个月第一天开始之前”的时间测试。这是'开始'位有所作为。