CoreData谓词按日期

时间:2012-11-17 05:43:08

标签: nsdate nspredicate

我已经设置了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对象集,然后创建了另一个NSDate对象,设置为今天之前的30天。然后尝试从开始日期到当前日期预测所有对象。

我收到了结果,但它们似乎与过去30天的总数不匹配。它似乎只是归还了一切!

有什么想法吗?

1 个答案:

答案 0 :(得分: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];