Core data NSPredicate和CoreData-确定日期属性是否为;“今天”;(或昨晚12点到今晚12点)在iOS上

Core data NSPredicate和CoreData-确定日期属性是否为;“今天”;(或昨晚12点到今晚12点)在iOS上,core-data,nsdate,uitableview,nspredicate,nsfetchedresultscontroller,Core Data,Nsdate,Uitableview,Nspredicate,Nsfetchedresultscontroller,我正在使用NSFetchedResultsController和UITableViewController从CoreData数据库填充UITableView 我有一个NSDate对象保存到这个日期属性中,标记为“startTime”。然后,我尝试使用一个如下所示的NSPredicate来提取今天的数据: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate == %@",

我正在使用
NSFetchedResultsController
UITableViewController
从CoreData数据库填充UITableView

我有一个
NSDate
对象保存到这个日期属性中,标记为“startTime”。然后,我尝试使用一个如下所示的
NSPredicate
来提取今天的数据:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate == %@",
                          todaysDate];
我没有得到任何结果。我之所以理解这一点,是因为一个
NSDate
对象只包含自1970年1月1日以来的秒数或毫秒数,对吗?因此,在同一天比较1111和1112,两个不同的
NSDate
对象是不相等的

那么,如何格式化
NSPredicate
,使其能够执行此操作呢?我猜它创建了两个
NSDate
对象:一个是昨晚12点,另一个是今晚12点,比较startDate,看看它是否在这两个
NSDate
s之间


我对NSPredicate有点陌生,那么这是如何实现的呢?

使用
NSCompoundPredicate

NSPredicate *firstPredicate = [NSPredicate predicateWithFormat:@"startDate > %@", firstDate];
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"startDate < %@", secondDate];

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:firstPredicate, secondPredicate, nil]];

要在今晚12点之前完成,请更改
组件。白天

您应该将解决方案放在答案中,而不是放在问题中。不能@yuji,因为我还没有足够的代表。也许您可以将解决方案放在答案中。同时,我已经把它删掉了,因为你已经接受了yuji的答案。您可以通过查看修订历史记录来恢复解决方案。谢谢。非常感谢-两个小的输入错误-和PredicateWithSubpredicates(小写P),并使用NSDateComponents而不是NSCalendarComponents
NSCalendar *calendar = [NSCalendar calendar]; // gets default calendar
NSCalendarComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:[NSDate date]]; // gets the year, month, and day for today's date
NSDate *firstDate = [calendar dateFromComponents:components]; // makes a new NSDate keeping only the year, month, and day