使用NSPredicate的NSArray过滤器,比较日期

时间:2015-07-14 02:01:37

标签: objective-c filter nsarray nsdate nspredicate

我有一个Person实体,其中属性date_of_birth被声明为NSString。如果我有一个“人物”阵列。实例,我需要将它们过滤到仅date_of_birth小于25/11/2005的那些我使用的谓词,其格式为NSLogged时为:

FUNCTION(date_of_birth, "yyyy_MM_dd_dateFormat") <[cd] CAST(154575908.000000, "NSDate")

其中yyyy_MM_dd_dateFormat()是NSString上的一个类别方法,它将字符串实例作为日期返回。

我没有得到预期的结果。我做错了什么,它的位置是CAST(154575908.000000, "NSDate"并且有效吗?

更新:由于项目的规模,成熟度和复杂性,目前不能将date_of_birth属性类型更改为NSDate。

2 个答案:

答案 0 :(得分:2)

日期最好用NSDate表示,它通过earlierDate:laterDate:方法实现不等式。这些回答了接收器和参数之间的早期/晚期日期。

您的转换方法可能看起来像这样......

// return an NSDate for a string given in dd/MM/yyyy
- (NSDate *)dateFromString:(NSString *)string {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd/MM/yyyy"];
    return [formatter dateFromString:string];
}

可以使用基于块的NSPredicate使用NSDate比较来过滤数组...

NSDate *november25 = [self dateFromString:@"25/11/2005"];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(Person *person, NSDictionary *bind){
    // this is the important part, lets get things in NSDate form so we can use them.
    // of course it would be quicker to alter the data type, but we can covert on the fly
    NSDate *dob = [self dateFromString:person.date_of_birth];
    return date_of_birth == [november25 earlierDate:dob];
}];

// assumes allPeople is an NSArray of Person objects to be filtered
// and assumes Person has an NSString date_of_birth property
NSArray *oldPeople = [allPeople filteredArrayUsingPredicate:predicate];

答案 1 :(得分:0)

此处,人日期是NSDate的类型。

NSPredicate * predicate2 = [NSPredicate predicateWithFormat:@&#34; date&gt; =%@&#34;,person.date];

list = [list filteredArrayUsingPredicate:predicate2];

但是如果您使用NSString类型保存,则需要将比较日期转换为字符串而不是使用而不是&gt; =