2013-10-16 74 views
0

我想檢查2 NSDate s他們是在同一天(時間可能不同)。 什麼我現在是這樣的:NSPredicate for checking the same date

- (NSPredicate*) predicateWithDate:(NSDate *)date { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:date]; 
    //create a date with these components 
    NSDate *startDate = [calendar dateFromComponents:components]; 
    [components setMonth:0]; 
    [components setDay:1]; 
    [components setYear:0]; 
    NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0]; 
    return [NSPredicate predicateWithFormat:@"((ANY notes.date >= %@) AND (ANY notes.date < %@))",startDate,endDate]; 
} 

回答

1

你的startDate,結束日期計算看起來幾乎是正確的,你只是忘記了NSDayCalendarUnit

NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; 

有不同的方法來計算的起始和終止日期當天, 我更喜歡以下略短代碼:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDate *startDate; 
NSTimeInterval interval; 
[calendar rangeOfUnit:NSDayCalendarUnit startDate:&startDate interval:&interval forDate:date]; 
NSDate *endDate = [startDate dateByAddingTimeInterval:interval]; 

你的斷言會發現所有具有date >= startDate, 和任何(可能不同)備註的對象都可以使用date < endDate

如果你想找到對某一天至少​​一個註釋對象,你需要一個子查詢:

[NSPredicate predicateWithFormat:@"SUBQUERY(notes, $n, $n.date >= %@ AND $n.date < %@)[email protected] > 0", 
      startDate,endDate]; 
+0

感謝這麼詳細的解答! 我檢查並得到一個異常「終止應用程序由於未捕獲異常'NSInvalidArgumentException',原因:'無法解析格式字符串」SUBQUERY(注意,$ n,$ n.date> =%@ AND $ n.date < [email protected]).count > 0 「'」「 – Shmidt

+0

@Shmidt:哎呀,'count'應該是'@ count',在回答中固定 –

+0

我試着更新了兩遍以上的代碼並清理了項目,但它仍然顯示相同的異常 – Shmidt

相關問題