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 谓词按日期的主要内容,如果未能解决你的问题,请参考以下文章

CoreData NSPredicate 按日期获取数据

如何在 coredata 中设置日期和时间间隔的谓词

Swift coreData - 格式化日期并在谓词中使用它

具有长长值的 CoreData 的 iOS 谓词不够精确

coredata获取请求中的日期比较?

谓词,从 NSDate 中按年份过滤,产生一个 nil 日期和一个讽刺的 Xcode 错误