Comparación de fecha de predicados de datos básicos

Estoy intentando buscar todos los objetos en una entidad que coincida con un usuario selectedDate (es un NSDate). El código de Core Data está bien, pero mi predicado sigue arrojando 0 resultados, las fechas son las mismas en la base de datos que el usuario está seleccionando.

¿Cómo se debe comparar el Fecha seleccionada con una fecha de una entidad que usa un predicado?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate = %@)", selectedDate]; 

    Tu predicado parece estar bien.

    Sin embargo, es posible que el motivo por el que no se obtiene ningún resultado sea que las fechas no sean las mismas.

    Por ejemplo:

    05/04/2012 13:37:00 no coincidirá con 05/04/2012 13:37:01 ya que estos dos valores no son exactamente iguales.

    ¿Desea verificar la fecha (día, mes, año) y la hora?

    Si solo desea verificar la fecha, debe crear una fecha de inicio y una fecha de finalización y compararlas utilizando la fecha seleccionada por el usuario como marco de referencia.

    Algo similar a esto debería crear una fecha y hora para 00:00:00.

     //gather current calendar NSCalendar *calendar = [NSCalendar currentCalendar]; //gather date components from date NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; //set date components [dateComponents setHour:0]; [dateComponents setMinute:0]; [dateComponents setSecond:0]; //return date relative from date return [calendar dateFromComponents:dateComponents]; 

    Cree otra fecha configurando las horas, los minutos y los segundos a 23:59:59 y verifique que la fecha seleccionada por el usuario esté entre estos rangos.

     [NSPredicate predicateWithFormat:@"date BETWEEN %@", [NSArray arrayWithObjects:startOfDay, endOfDay, nil]] 

    Mientras que en la comunicación humana la fecha a menudo es igual al día, no es lo mismo con los objetos NSDate: Un NSDate representa un solo momento en el tiempo. Las fechas que son diferentes solo en segundos no son iguales. Y en realidad no representan los días, meses, años en absoluto, ya que esto es diferente del sistema de calendario al sistema de calendario

    debe definir por usted mismo si las fechas en el mismo minuto, hora, día … son iguales. Entonces, básicamente, debes enseñar el progtwig para permitir cierta confusión.

    aquí para una resolución de minutos

     NSDate *startDate = ....; NSTimeInterval length; [[NSCalendar currentCalendar] rangeOfUnit:NSMinuteCalendarUnit startDate:&startDate interval:&length forDate:startDate]; NSDate *endDate = [startDate dateByAddingTimeInterval:length]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate >= %@) AND (eDate < %@)", startDate, endDate]; 

    Para las fechas del mismo día (consciente de las zonas horarias y los horarios de ahorro de luz diurna), simplemente cambiaría esto:

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

    Puedo trabajar con algunas modificaciones en la respuesta aceptada y utilizar la API de iOS 8 para crear fechas con compensación de tiempo. El código:

     NSCalendar *calendar = [[FFSharedCalendar singleton] getGregorianCalendar]; NSDate *startOfDay = [calendar dateBySettingHour:0 minute:0 second:0 ofDate:[NSDate date] options:0]; NSDate *endOfDay = [calendar dateBySettingHour:23 minute:59 second:59 ofDate:[NSDate date] options:0]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdAt > %@ AND createdAt < %@", startOfDay, endOfDay]; NSArray* plans = [Plan MR_findAllWithPredicate:predicate]; 

    Espero que ayude a alguien

    Hace poco tiempo intenté resolver el mismo problema y resolví lo siguiente, ahora actualizado para iOS 8 y versiones posteriores …

     NSDate *dateDay = nil; NSDate *dateDayStart = nil; NSDate *dateDayNext = nil; dateDay = < >; //for example - selectedDate dateDayStart = [[NSCalendar currentCalendar] startOfDayForDate:dateDay]; // dateDayNext EITHER dateDayNext = [dateDayStart dateByAddingTimeInterval:(24 * 60 * 60)]; // dateDayNext OR NSDateComponents *dateComponentDay = nil; dateComponentDay = [[NSDateComponents alloc] init]; [dateComponentDay setDay:1]; dateDayNext = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponentDay toDate:dateDayStart options:NSCalendarMatchNextTime]; 

    … y NSPredicate para Core Data NSFetchRequest (como ya se ha mostrado anteriormente en otras respuestas) …

     [NSPredicate predicateWithFormat:@"(dateAttribute >= %@) AND (dateAttribute < %@)", dateDayStart, dateDayNext]]