在我的本地数据库中,我有一个保存的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。
请就此问题提供意见。
答案 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日的同一时间之间整整零天。