我有一些数据(NSDictionary
中为NSMutableArray
),示例数据就像,
将每一行视为NSDictionary
,整个表格为NSMutableArray
包含事件。
我想在两个日期之间生成结果,因此我使用NSPredicate
来过滤我的数据。
这是我的代码段,
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Date >= %@ AND
Date <= %@", startDate,endDate];
NSArray *filter = [arrayEvents filteredArrayUsingPredicate:predicate];
测试过滤:
案例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不正确。
备注:
NSString
- hyphen
而不是/ (forward slash)
有人请帮助我,我在这里做错了什么?我失踪了什么?我知道还有其他几个问题,但没有一个问题对我有帮助。
答案 0 :(得分:7)
您需要将数据类型更改为日期(这里甚至最有意义)。 您的测试会按时间传递,因为它们完全匹配一个字符串,而您的谓词包含等号。 所以如果你只是查询&lt;和&gt;在每个&#34;测试&#34;
中都不会返回任何结果然后你的代码段
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Date >= %@ AND
Date <= %@", startDate,endDate];
NSArray *filter = [arrayEvents filteredArrayUsingPredicate:predicate];
按预期工作。没有办法用字符串做,因为它需要一个日期格式化程序来解析字符串中的日期并进行比较。这绝对是低效率的。 因此,如果您真的想要过滤它,请创建一个NSDateFormatter实例并运行每个Dictionary。删除日期并将新格式化的日期与开始日期和结束日期进行比较。如果是在它之间将它添加到结果数组(也需要在之前创建它)。
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];
}
}
//在这里使用过滤后的数组
答案 1 :(得分:1)
我没有多使用NSPredicate
,但几乎可以肯定不支持字符串中日期比较的概念。如果您使用正确的类型来表示您的数据,那么您肯定会取得更大的成功。正确的数据类型为NSDate
。
答案 2 :(得分:0)
你不能比较那两个字符串。你可以使用timestamp而不是String,然后你可以比较它。