9

我使用 Core Data 来存储我的数据模型对象。每个对象都有 NSDate 属性。

NSDate 属性的格式如下:

2013-03-18 12:50:31 +0000

我需要创建一个谓词,它会在2013-03-18没有时间的情况下通过这个值来获取我的对象。

4

2 回答 2

11

如果您的日期存储为实际日期,那么您应该利用它来发挥自己的优势,而不是摆弄格式。您可以简单地创建一个谓词来检查日期是否在两个日期之间(带有时间)。第一个日期是您的日期,时间为 00:00:00,第二个日期是在那之后的一天。

// Create your date (without the time)
NSDateComponents *yourDate = [NSDateComponents new];
yourDate.calendar = [NSCalendar currentCalendar];
yourDate.year  = 2013;
yourDate.month = 3;
yourDate.day   = 18;
NSDate *startDate = [yourDate date];

// Add one day to the previous date. Note that  1 day != 24 h
NSDateComponents *oneDay = [NSDateComponents new];
oneDay.day = 1;
// one day after begin date
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay 
                                                                toDate:startDate
                                                               options:0];

// Predicate for all dates between startDate and endDate
NSPredicate *dateThatAreOnThatDay = 
    [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", 
                                     startDate, 
                                     endDate]];
于 2013-03-19T13:02:38.893 回答
4

虽然 David 展示了如何创建谓词,但我想添加一种更简单的方法来生成 0:00 的日期

NSDate *startDate = [NSDate date];
NSTimeInterval lengthDay;

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit 
                                startDate:&startDate
                                 interval:&lengthDay 
                                  forDate:startDate];

startDate现在包含代表0:00今天当前时区的日期

NSDate *endDate = [startDate dateByAddingTimeInterval:lengthDay];

现在我们可以把它放到谓词中

NSPredicate *daySpanPredicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", startDate, endDate];

感谢MartinR的改进。

于 2013-03-19T13:11:07.083 回答