CoreData 谓词按日期
Posted
技术标签:
【中文标题】CoreData 谓词按日期【英文标题】:CoreData predicate by date 【发布时间】:2012-11-17 05:43:08 【问题描述】:我已经设置了一个 coreData 模型并添加了数据。我想搜索过去 30 天内的所有项目,然后将总单位数相加。
这是我得到的:-
- (void) calculateThirtyDayValues
NSDate *endDate = [NSDate date];
NSTimeInterval timeSinceRefDate = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval lastThirtyDays = timeSinceRefDate- 2592000;
NSDate *startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:lastThirtyDays];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date >= %@) AND (date <= %@)", startDate, endDate];
基本上我已经创建了一个设置今天日期的 NSDate 对象,然后创建了另一个设置为今天前 30 天的 NSDate 对象。然后尝试断言从开始日期到当前日期的所有对象。
我收到了返回的结果,但它们似乎与过去 30 天的总数不匹配。它似乎只是返回所有东西!
有什么想法吗?
【问题讨论】:
【参考方案1】:您的谓词似乎没问题,但您的日期代码不正确,原因有几个。
[NSDate date]
返回当前日期,精度为亚毫秒。因此,如果您在当地时间下午 4:15:37 创建谓词,则该谓词将找不到任何日期为当地时间下午 5:37:42 的对象。如果您想要像这样精确到秒的精度,那么您可能没问题。但是,如果您希望将粒度设置为不同的日历单位(例如按天),那么您需要做更多的工作。
并非每天都有 86,400 秒。因此,您尝试减去 (30*86400) 是错误的。您应该让日历对象为您计算:
NSDate *endDate = ...;
NSDateComponents *diff = [[NSDateComponents alloc] init];
[diff setDay:-30];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startDate = [calendar dateByAddingComponents:diff toDate:endDate options:0];
【讨论】:
以上是关于CoreData 谓词按日期的主要内容,如果未能解决你的问题,请参考以下文章