NSPredicate для получения только сегодняшних событий

Я использую EventKit.framework для получения событий, хранящихся в EKEventStore.

Как я могу получить только сегодняшние события, то есть с утра 00:00 до 23:59 (с 00:00 до 23:59). Часовой пояс может быть любым.

Я использую приведенный ниже фрагмент кода, но он также дает событие следующего дня. К сегодняшней дате добавляется 24 часа.

-(void) fetchEvents{
    NSDate *startDate = [NSDate date] ;

    //Create the end date components
    NSDateComponents *tomorrowDateComponents = [[NSDateComponents alloc] init];
    tomorrowDateComponents.day = 1;

    NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:tomorrowDateComponents
                                                                    toDate:startDate
                                                                   options:0];
    // We will only search the default calendar for our events
    NSArray *calendarArray = [NSArray arrayWithObject:self.defaultCalendar];

    // Create the predicate
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate
                                                                      endDate:endDate
                                                             calendars:calendarArray];

    // Fetch all events that match the predicate
    NSMutableArray *events = [NSMutableArray arrayWithArray:[self.eventStore eventsMatchingPredicate:predicate]];
}

Как изменить NSPredicate для вышеуказанного требования?


person user2533604    schedule 01.08.2014    source источник
comment
Это должно работать, если вы запустите его в полночь. ;-) В любой другой раз это не удастся, потому что сейчас будет startDate. Замените код, создающий startDate, чем-то, что на самом деле создает NSDate на сегодняшнюю полночь.   -  person Matthias Bauch    schedule 01.08.2014
comment
@MatthiasBauch Как я могу получить завтрашнюю полночь, то есть 00:00. Если сегодня 1 июля, как я могу получить 00:00 2 июля?   -  person user2533604    schedule 01.08.2014
comment
Вы можете использовать NSCalendar метод dateByAddingUnit или dateByAddingComponents с даты начала.   -  person Rob    schedule 14.08.2014


Ответы (1)


Если вам нужны сегодняшние события, есть много способов сделать это, но вы можете получить текущую дату/время, а затем попросить календарь установить дату начала и окончания на основе соответствующих часов, минут и секунд.

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSDate *startDate = [calendar dateBySettingHour:0  minute:0  second:0  ofDate:now options:0];
NSDate *endDate   = [calendar dateBySettingHour:23 minute:59 second:59 ofDate:now options:0];

NSPredicate *predicate = [store predicateForEventsWithStartDate:startDate
                                                        endDate:endDate
                                                      calendars:nil];

NSArray *events = [store eventsMatchingPredicate:predicate];

Если вы хотите, чтобы endDate было 00:00 следующего дня, вы можете сделать:

NSDate *endDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startDate options:0];
person Rob    schedule 14.08.2014