2011-12-09 46 views
7

我有一個日期選擇器。獲取未來的NSDates陣列

從這裏選擇一段時間後,我想獲得未來64個星期一的日期。

我將如何去寫一個方法,採取的日期從該日起

用於例如在未來64個星期一返回NSDates的一個NSArray 我選擇了從日期選擇器下午6:45的時間,然後我想取得下次64個星期一的時間設置爲那個時間。

+8

爲了記錄在案,我不同意密切票。 –

+0

是的...這是一個非常具有挑戰性的問題;阿亞茲,當你說你想「抓取」未來的64個星期一時,你想以什麼樣的方式進行抓取? NSDates或EKEvents或? –

+0

我想NSDates ... –

回答

3

實施例(ARC):

NSDate *pickerDate = [NSDate date]; 
NSLog(@"pickerDate: %@", pickerDate); 

NSDateComponents *dateComponents; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate]; 
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday]; 
dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setDay:firstMondayOrdinal]; 
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0]; 

dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setWeek:1]; 

for (int i=0; i<64; i++) { 
    [dateComponents setWeek:i]; 
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0]; 
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate); 
} 

的NSLog輸出:
pickerDate:2011-12-09 20時38分:25 +0000
week#:0,mondayDate:2011-12-12 20:38:25 +0000
week#:1,mondayDate:2011-12-19 20:38:25 +0000
week# :2,mondayDate:2011-12-26 20:38:25 +0000 周#:3,mondayDate:2012-01-02 20點38分25秒+0000
-the其餘60這裏 -

+0

感謝您的明確回覆。接下來的4個星期一。我應該循環63次而不是4次嗎? –

+0

我只是展示了前四個,我編輯了這個更清晰。 – zaph

+1

只是好奇,你計算'firstMondayOrdinal'的'9'是從哪裏來的? –

1

您可以使用NSCalendar來確定今天(在選定的時間)一週中的哪一天是;將它撞到下一個星期一,然後將它衝撞7天63次,以獲得你想要的星期一。

2

從選取器開始選擇NSDate,並且一直添加24 * 60 * 60秒直到它成爲星期一。將結果日期添加到結果中。繼續添加7 * 24 * 60 * 60秒到您添加的最後日期,並將結果推送到返回列表中,直到您擁有全部64個星期一。這裏是你如何判斷一個NSDate落在星期一:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest]; 
NSInteger weekday = [weekdayComponents weekday]; 
if (weekday == 2) ... // 2 represents Monday 

編輯:DaveDeLong指出了上述算法的缺陷:它會兩次轉移的時間更改爲夏令時的日子。代替計數秒手動,使用此代碼至每天添加NSDate

NSDate *currentDate = [NSDate date]; 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:1]; // Add 1 when searching for the next Monday; add 7 when iterating 63 times 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate options:0]; 
[comps release]; 
+2

否否否否否這不記錄夏令時!提問者明確表示他想保持同一時間。 –

+0

@DaveDeLong很好,趕上!正在修復... – dasblinkenlight

+1

@DaveDeLong如果Apple從過去的表現中判斷出夏令時是否知曉,則有些討論。 :-) – zaph