2012-03-18 75 views
1

我有一個核心數據上下文,其中包含存儲日期的對象。我想按照該順序僅獲取當週(週一至週日)的數據。我不是在尋找最近7天。核心數據從本週獲取數據

日期可以是實體內部存儲的日期,也可以是將對象添加到核心數據時的數據(它們是相同的)。

我可以使用謂詞的開始日期和結束日期如下:

NSPredicate *weekPredicate = [NSPredicate predicateWithFormat:@"((date > %@) AND (date <= %@)) || (date = nil)",startDate,endDate]; 

,但我怎麼計算的startDate和結束日期?

回答

3
-(NSDate *) lastMondayBeforeDate:(NSDate*)timeStamp { 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *comps = 
     [gregorian components:NSWeekdayCalendarUnit fromDate:timeStamp]; 
    NSInteger weekday = [comps weekday]; 
    weekday = weekday==1 ? 6 : weekday-2; // start with 0 on Monday rather than 1 on Sunday 
    NSTimeInterval secondsSinceMondayMidnight = 
    (NSUInteger) [timeStamp timeIntervalSince1970] % 60*60*24 + weekday * 60*60*24; 
    return [timeStamp dateByAddingTimeInterval:-secondsSinceMondayMidnight]; 
} 

-(NSDate *) nextMondayAfterDate:(NSDate*)timeStamp { 
    return [[self lastMondayBeforeDate:timeStamp] 
     dateByAddingTimeInterval:60*60*24*7]; 
} 
1

指出你只需要從星期一開始的當前星期意味着結束日期將是「今天」並且開始日期是:「最後一個星期一」。

指的蘋果的文檔:

有用於日期和時間的工作三大類。

NSDate允許您表示絕對時間點。

NSCalendar允許您表示特定的日曆,如公曆或希伯來日曆。它爲大多數基於日期的計算提供接口,並允許您在NSDate對象和NSDateComponents對象之間進行轉換。

NSDateComponents允許您表示特定日期的組件,例如小時,分鐘,日,年等。

除了這些類,NSTimeZone還允許您表示地緣政治區域的時區信息。它簡化了在不同時區工作並執行可能受夏時制轉換影響的計算的任務。

然後,您就可以看是星期幾的我們目前有:

NSDateComponents例如具有此方法:

- (NSInteger)weekday 

返回值 工作日數接收器的單位。

討論 平日單位是數字1到n,其中n是一週中的天數。例如,在公曆中,n是7和週日由1

這裏表示朝date and time programming guide

1

從別人只是一些建議已經用日期工作的鏈接並在過去很多時間。日期會變得凌亂!沒有辦法繞過它。你會得到許多代碼和DateCompnents在各處飛行,更不用說日曆和時區,只是爲了計算你認爲只需要一點數學的東西。你真的應該看看臭名昭着的Erica Sadun的NSDate類別(NSDate-Extentions)。

https://github.com/erica/NSDate-Extensions

我不能告訴我是多麼希望,我發現這個越快。還請閱讀Apple Doc中的日期和編程指南,當您再次閱讀時,它至少不是輕讀數。

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtDates.html

(我知道,這是一條評論不是答案。)