我有一個日期選擇器。獲取未來的NSDates陣列
從這裏選擇一段時間後,我想獲得未來64個星期一的日期。
我將如何去寫一個方法,採取的日期從該日起
用於例如在未來64個星期一返回NSDates的一個NSArray 我選擇了從日期選擇器下午6:45的時間,然後我想取得下次64個星期一的時間設置爲那個時間。
我有一個日期選擇器。獲取未來的NSDates陣列
從這裏選擇一段時間後,我想獲得未來64個星期一的日期。
我將如何去寫一個方法,採取的日期從該日起
用於例如在未來64個星期一返回NSDates的一個NSArray 我選擇了從日期選擇器下午6:45的時間,然後我想取得下次64個星期一的時間設置爲那個時間。
實施例(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這裏 -
感謝您的明確回覆。接下來的4個星期一。我應該循環63次而不是4次嗎? –
我只是展示了前四個,我編輯了這個更清晰。 – zaph
只是好奇,你計算'firstMondayOrdinal'的'9'是從哪裏來的? –
您可以使用NSCalendar來確定今天(在選定的時間)一週中的哪一天是;將它撞到下一個星期一,然後將它衝撞7天63次,以獲得你想要的星期一。
從選取器開始選擇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];
否否否否否這不記錄夏令時!提問者明確表示他想保持同一時間。 –
@DaveDeLong很好,趕上!正在修復... – dasblinkenlight
@DaveDeLong如果Apple從過去的表現中判斷出夏令時是否知曉,則有些討論。 :-) – zaph
爲了記錄在案,我不同意密切票。 –
是的...這是一個非常具有挑戰性的問題;阿亞茲,當你說你想「抓取」未來的64個星期一時,你想以什麼樣的方式進行抓取? NSDates或EKEvents或? –
我想NSDates ... –