Piero
Piero

Reputation: 9273

NSPredicate filter array, for NSDate

i have an array of NSManagedObject take from my core data, and i want filter the array with the date that is >= of today, so i do this:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(firstAired >= %@)", [NSDate date]];

but find me only the date > of today, and the date of today don't, why?

Upvotes: 0

Views: 2547

Answers (4)

Piero
Piero

Reputation: 9273

        NSDate *now = [NSDate date];
        NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
        calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
        NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
        [components setHour:00];
        NSDate *today = [calendar dateFromComponents:components];

in this way works, thanks to all...

Upvotes: 2

Nikita Pestrov
Nikita Pestrov

Reputation: 5966

You should create Midnight date,like this, and pass it to the predicate

      NSDateComponents *currentComponents = [[NSCalendar currentCalendar]components:NSMinuteCalendarUnit|NSHourCalendarUnit|NSSecondCalendarUnit fromDate:[NSDate date]];
[currentComponents setMinute:0];
[currentComponents setHour:0];
[currentComponents setSecond:0];
NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *dateToCheck = [calendar dateFromComponents:currentComponents];

Upvotes: 2

Gabriel
Gabriel

Reputation: 3359

Because [NSDate date] returns the exact date with hour, minute, second .... of the instant when it is executed. If you want to search for every "today" item then you have to change [NSDate date] with a NSDate object for today at midnight. That is, extract the date components from NSDate.date and then, using the components year, month and day build a new date object with hour: 00:00AM.

Upvotes: 0

unexpectedvalue
unexpectedvalue

Reputation: 6139

[NSDate date] is the current time. So this predicate will fetch only records where firstAired is later today or later, and not earlier today. Construct an NSDate with the time 00:00:00.

Upvotes: 0

Related Questions