NSPredicate在NSStringtypes的两个date之间过滤
我有一些数据( NSDictionary
在NSMutableArray
),样本数据就像,
考虑每一行为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是
NSString
types的 - 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,那么你可以比较相同的。