2011-07-25 35 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 
    }