2011-07-25 18 views
8

Estoy perplejo tratando de escribir un predicado de "recientemente finalizado las tareas", es decir, mostrar la tarea si se completó en los últimos 7 días. Creo que tengo que hacer algo como esto: "si AHORA < dateCompleted + 7 days".Core Data-predicado con fechas

El dateCompleted es un atributo de la tabla, pero no estoy seguro de cómo se supone que debo obtener su valor y añadir 7 días a la misma desde dentro del predicado. Supongo que necesito buscar el valor del atributo primero antes de escribir NSPredicate, pero ¿cómo? No tengo acceso a managedObject en este momento.

Esto podría estar cerca de la solución, pero no puedo encontrar la manera de definir 'oneWeek' y no creo que sólo puede agregar valores al definir el predicado:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ < todoCompletedDate + %@", [NSDate date], oneWeek]; 

Respuesta

17

Eres casi allí.

En primer lugar es necesario definir el intervalo de fechas. Para hacer eso, querrás comenzar con la fecha de hoy y luego agregar una semana de días para encontrar el final del rango válido. Una vez que tenga ese rango, puede construir su predicado para encontrar todas las tareas con fecha de vencimiento> = start y < = end. He aquí un extracto de un código que he escrito para hacer algo muy similar ...

NSDate *today = [NSDate date]; 
NSDate *startOfToday = [DateHelper startOfDay:today]; 
NSDate *endOfWeek = [DateHelper addDaysToDate:today daysToAdd:6]; 
return [NSPredicate predicateWithFormat:@"(dueDate >= %@) AND (dueDate <= %@) AND complete == 0", startOfToday, endOfWeek]; 
+0

Gracias. Quería que todoCompleteDate fuera en los últimos 7 días, pero lo descubrí gracias a su respuesta. –

+5

respuesta bastante buena, pero debe tener en cuenta utilizar bibliotecas de terceros, sin mencionar ellos :) estoy bastante novato que había tiempo averiguar dónde demonios estaba DateHelper en bases :) – Zerho

+0

@Zerho También podría ser una clase que se hizo para calcular los cálculos de fecha – Jasper

-1

Para obtener el comienzo del día se puede utilizar:

NSDate *date = [NSDate date]; 
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date]; 
NSDate *startDate = [gregorianCalendar dateFromComponents:dateComponents]; 

y para obtener la fecha de finalización:

NSCalendar* gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents* dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date]; 
[dateComponents setHour:23]; 
[dateComponents setMinute:59]; 
[dateComponents setSecond:59]; 
[dateComponents setDay:[dateComponents day]+7]; 
NSDate *endDate = [gregorianCalendar dateFromComponents:dateComponents]; 
+0

¡No trata los predicados! – user2666705

0

Para conseguir una semana antes de los datos de hoy. código SWIFT

let calendar = NSCalendar.currentCalendar() 
let now = NSDate() 
let nowTimeStamp = self.getCurrentTimeStampWOMiliseconds(now) 

let sevenDaysAgo = calendar.dateByAddingUnit(.Day, value: -7, toDate: now, options: [])! 
let startDate = calendar.startOfDayForDate(sevenDaysAgo) 
let startDateTimeStamp = self.getCurrentTimeStampWOMiliseconds(startDate) 

let predicate1 = NSPredicate(format:"(iCreatedAt >= %@) AND (iCreatedAt < %@) AND location = %@", startDateTimeStamp, nowTimeStamp) 

En mi caso tengo el valor de marca de tiempo de la post en mi CoreData DB así que a usar más adelante función también para obtener el valor de marca de tiempo

func getCurrentTimeStampWOMiliseconds(dateToConvert: NSDate) -> String { 
     let objDateformat: NSDateFormatter = NSDateFormatter() 
     objDateformat.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     let strTime: String = objDateformat.stringFromDate(dateToConvert) 
     let objUTCDate: NSDate = objDateformat.dateFromString(strTime)! 
     let milliseconds: Int64 = Int64(objUTCDate.timeIntervalSince1970) 
     let strTimeStamp: String = "\(milliseconds)" 
     return strTimeStamp 
    }