2011-07-25 34 views
8

我努力为“最近完成”任务编写一个谓词,即如果在最近7天内完成任务显示任务,我很难过。我想我需要这样做:“如果现在< dateCompleted + 7天”。使用日期的核心数据谓词

dateCompleted是表上的一个属性,但我不知道我应该如何获取它的值,并从谓词中为它添加7天。我想在编写NSPredicate之前我需要首先获取属性值,但是怎么做呢?我目前无法访问managedObject。

这可能是接近的解决方案,但我想不出如何定义“oneWeek”,我不认为界定谓词时,你可以添加值:

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

回答

17

你差不多了。

首先你需要定义你的日期范围。要做到这一点,您需要从今天的日期开始,然后添加几周的时间来查找有效范围的结束。一旦你有了这个范围,你可以建立你的谓词来查找所有任务的截止日期> = start和< = end。下面是一些代码,我已经写做一些非常相似的提取物...

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

感谢。我希望todoCompleteDate可以在最近7天内完成,但是我想出了答案。 –

+5

相当不错的答案,但你应该注意使用第三方库,而不提他们:) 我很漂亮的小白我有时间搞清楚地狱是DateHelper在基础:) – Zerho

+0

@ZERHO它也可以是他自己创建的类计算日期计算 – Jasper

-1

要获得一天的开始,你可以使用:

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

,并获得最终日期:

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

不处理谓词! – user2666705

0

从今天获得数据之前的一周。 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) 

在我的情况,我有交在我coreData DB的时间戳值,因此我用下面的功能也得到时间戳值

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 
    }