NSPredicate在NSStringtypes的两个date之间过滤

我有一些数据( NSDictionaryNSMutableArray ),样本数据就像,

在这里输入图像说明

考虑每一行为NSDictionary ,整个表是一个NSMutableArray包含事件。

我想在两个date之间产生结果,所以我使用NSPredicate来过滤我的数据。


这是我的代码片段,

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Date >= %@ AND Date <= %@", startDate,endDate]; NSArray *filter = [arrayEvents filteredArrayUsingPredicate:predicate]; 

testing过滤


情况1:

 NSString *startDate = @"01/07/14"; NSString *endDate = @"31/07/2014"; 

输出:所有事件(行)。


案例2:

 NSString *startDate = @"20/07/14"; NSString *endDate = @"31/07/2014"; 

输出:最后四个事件(行)。


案例3:

 NSString *startDate = @"11/07/14"; NSString *endDate = @"20/07/2014"; 

输出:只有第二个事件(行)。


案例4:

 NSString *startDate = @"01/08/14"; NSString *endDate = @"31/08/2014"; 

输出:所有事件(行)。


结论:

情况1,2和3是正确的,情况4不正确。


笔记:

  • date是NSStringtypes的
  • date格式是date – 月 – 年(即日/月/年)
  • 同样的结果甚至date格式化- hyphen而不是/ (forward slash)
  • 即使我们改变了date格式的月份date年(即MM / dd / yyyy)也是如此

有人请帮我在这里做错了吗? 任何我失踪的东西? 我知道还有其他几个问题,但没有一个帮助我。

你需要改变你的数据types(甚至在这里最有意义)。 您的testing按时间传递,因为它们完全匹配一个string,而您的谓词包含等号。 所以,如果你只是查询<和>没有结果将在每个“testing”返回

然后你的片段

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Date >= %@ AND Date <= %@", startDate,endDate]; NSArray *filter = [arrayEvents filteredArrayUsingPredicate:predicate]; 

按预期工作。 有没有办法做到这一点与string,因为它需要一个date格式化程序来parsingstring的date和比较。 这将是绝对低效的。 所以,如果你真的想过滤这个,创build一个NSDateFormatter的实例,并通过每个字典运行。 拿出date并将新格式化date与开始date和结束date进行比较。 如果是在它之间添加到结果数组(也需要在之前创build)。

 NSMutableArray* result = [NSMutableArray array]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"dd/MM/yy"; for (NSDictionary *dict in yourArray) { NSString *dateString = dict[@"Date"]; NSDate *date = [formatter dateFromString:dateString]; if ([date compare:startDate] > 0 && [date compare:endDate] < 0) { [result add:dict]; } } 

//在这里使用过滤的数组

我还没有使用NSPredicate ,但是string中date比较的概念几乎肯定不被支持。 如果你使用正确的types来表示你的数据,那么你肯定会有更多的成功。 正确的数据types是NSDate

你不能比较这两个string。 你可以使用时间戳而不是string,那么你可以比较相同的。