使用 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 而不是 >=
我有一个 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 而不是 >=