use*_*755 14 cocoa predicate objective-c nsdate
我试图获取匹配用户selectedDate的实体中的所有对象(它是一个NSDate).核心数据代码很好,但我的谓词不断返回0结果,数据库中的日期与用户选择的相同.
应该如何将selectedDate与使用谓词的实体的日期进行比较?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate = %@)", selectedDate];
Run Code Online (Sandbox Code Playgroud)
Cap*_*uff 23
你的谓词看起来很好.
您返回零结果的原因是,但可能是日期不完全相同.
例如:
05/04/2012 13:37:00将不匹配,05/04/2012 13:37:01因为这两个值不完全相同.
您想查看日期(日,月,年)以及时间吗?
如果您只想检查日期,则应创建开始日期和结束日期,并使用用户选择的日期作为参考框架进行比较.
类似的东西应该创建00:00:00的日期和时间.
//gather current calendar
NSCalendar *calendar = [NSCalendar currentCalendar];
//gather date components from date
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];
//set date components
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];
//return date relative from date
return [calendar dateFromComponents:dateComponents];
Run Code Online (Sandbox Code Playgroud)
通过将小时,分钟和秒设置为23:59:59来创建另一个日期,并检查用户选择的日期是否介于这些范围之间.
[NSPredicate predicateWithFormat:@"date BETWEEN %@", [NSArray arrayWithObjects:startOfDay, endOfDay, nil]]
Run Code Online (Sandbox Code Playgroud)
Vik*_*ica 12
虽然在人类交流日期通常与日期相同,但与NSDate对象不同:NSDate表示单个时刻.几秒钟内不同的日期不相等.实际上它们根本不代表日,月,年,因为这与日历系统和日历系统不同
你必须自己定义同一分钟,小时,日......的日期是否相等.所以基本上你必须教会程序以允许一些模糊性.
这里是分钟分辨率
NSDate *startDate = ....;
NSTimeInterval length;
[[NSCalendar currentCalendar] rangeOfUnit:NSMinuteCalendarUnit
startDate:&startDate
interval:&length
forDate:startDate];
NSDate *endDate = [startDate dateByAddingTimeInterval:length];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate >= %@) AND (eDate < %@)", startDate, endDate];
Run Code Online (Sandbox Code Playgroud)
对于同一天的日期(了解时区和夏令时),您只需更改此信息:
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit
startDate:&startDate
interval:&length
forDate:startDate];
Run Code Online (Sandbox Code Playgroud)