NSPredicate在NSString类型的两个日期之间进行过滤

时间:2014-07-10 06:34:08

标签: ios nsstring nsarray nspredicate

我有一些数据(NSDictionary中为NSMutableArray),示例数据就像,

enter image description here

将每一行视为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
  • 日期格式为日期 - 月 - 年(即dd / MM / yyyy)
  • 相同的结果,即使日期格式为- hyphen而不是/ (forward slash)
  • 即使我们更改日期格式月 - 日 - 年(即MM / dd / yyyy),也会有相同的结果

有人请帮助我,我在这里做错了什么?我失踪了什么?我知道还有其他几个问题,但没有一个问题对我有帮助。

3 个答案:

答案 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,然后你可以比较它。