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

NSArray filter using NSPredicate, comparing dates

我有一个 Person 实体,其中属性 date_of_birth 被声明为 NSString。如果我有一个 'Person' 实例数组,我需要将它们过滤到仅那些 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 上的类别方法,returns 字符串实例作为日期。

我没有得到预期的结果。我做错了什么吗,它说 CAST(154575908.000000, "NSDate" 是什么意思?

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

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

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

// 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];
}

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

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];

这里的person date是NSDate的类型。

NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"date >= %@",person.date];

列表=[列表filteredArrayUsingPredicate:predicate2];

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