我有一个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。
答案 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; =